Ninject 2.1 ActivationException:激活字符串时出错
我很困惑为什么我在随机绑定中收到“Ninject.ActivationException:错误激活字符串没有匹配的绑定可用,并且类型不可自行绑定”。 如果我将IMedia的绑定放在适当的位置,它将抛出ActivationException,但如果我使用CallbackProvider,它就会起作用。 所有这些类的结构都与几个不同的属性相同。 我很困惑,为什么ILocationType,IMedia和IFarmDataContext会引发ActivationException,而其他的则不会。 有任何想法吗?
/******************************
* Core Types
******************************/
Bind<IFarmDataContext>().ToProvider(new CallbackProvider<IFarmDataContext>(delegate { return new FarmDataContext(); }));
//Media
Bind<IMedia>().To<Media>(); //blows up
//Bind<IMedia>().ToProvider(new CallbackProvider<IMedia>(delegate { return new Media(); }));
Bind<IMediaType>().To<MediaType>();
Bind<IMediaRelated>().To<MediaRelated>();
//Location
Bind<ILocation>().To<Location>();
Bind<ILocationType>().ToProvider(new CallbackProvider<ILocationType>(delegate { return new LocationType(); }));
Bind<ILocationDetail>().To<LocationDetail>();
Ninject没有“媒体”键注入的“字符串键”绑定。 当它试图创建一个依赖于媒体的类型时,它不知道如何解决依赖和抛出。 对于大多数类型,Ninject会尝试为你创建一些东西,但是字符串和值类型不是可自我绑定的,因为我们对它们没有很好的默认值,它可能会对使用不同约定和基元的类型造成严重破坏。
您需要在绑定中添加参数值(.WithContructorArgument(“key”,someValue))或使用某种提供程序(您已完成)。
以下是IMedia界面和媒体实施。 媒体是通过LinqToSql DBML文件生成的主类的部分类。 上面列出的所有类型的绑定都是这种情况。
public interface IMedia : IValidationDictionary, IBaseDescriptor {
/// <summary>
/// Returns a specific Media object specifying
/// if you want the full or lite version
/// </summary>
/// <param name="id"></param>
/// <param name="isLite"></param>
/// <param name="context"></param>
/// <returns></returns>
IMedia Get(long id, bool isLite, DataContext context);
/// <summary>
/// Returns the lite version of the request Media object
/// </summary>
/// <param name="id"></param>
/// <param name="context"></param>
/// <returns></returns>
IMedia Get(long id, DataContext context);
/// <summary>
/// Returns a list of Media Objects
/// </summary>
/// <param name="isLite"></param>
/// <param name="context"></param>
/// <returns></returns>
ValidationList<IMedia> List(bool isLite, DataContext context);
/// <summary>
/// Returns a list of Media Objects with pagination capabilities
/// </summary>
/// <param name="isLite"></param>
/// <param name="skip"></param>
/// <param name="top"></param>
/// <param name="context"></param>
/// <returns></returns>
ValidationList<IMedia> List(bool isLite, int skip, int top, DataContext context);
}
public partial class Media : BaseDescriptor, IMedia {
#region Constructors
public Media(String key, IError error)
: base() {
AddError(key, error);
}
#endregion
#region Properties
public MediaType Type {
set { if (TypeID <= 0) { MediaType = value; } }
get { return MediaType; }
}
#endregion
#region Internal Methods
/// <summary>
/// Truncates relationships as appropriate to reduce over-the-wire size
/// </summary>
protected override void MakeLite() {
MediaRelateds = new EntitySet<MediaRelated>();
}
/// <summary>
/// Validates the values and returns true if there are no problems.
/// </summary>
override public bool Validate() {
this.ClearErrors();
if (this.TypeID <= 0) { this.AddError("TypeID", new Error(ErrorType.VALIDATION, "TypeID is missing or invalid")); }
if (string.IsNullOrEmpty(this.Path)) { this.AddError("Path", new Error(ErrorType.VALIDATION, "Path is missing or invalid")); }
if (this.CreatedOn.Year <= 1900) { this.AddError("CreatedOn", new Error(ErrorType.VALIDATION, "CreatedOn is missing or invalid")); }
if (this.CreatedBy <= 0) { this.AddError("CreatedBy", new Error(ErrorType.VALIDATION, "CreatedBy is missing or invalid")); }
if (this.UpdatedOn.Year <= 1900) { this.AddError("UpdatedOn", new Error(ErrorType.VALIDATION, "UpdatedOn is missing or invalid")); }
if (this.UpdatedBy <= 0) { this.AddError("UpdatedBy", new Error(ErrorType.VALIDATION, "UpdatedBy is missing or invalid")); }
if (!string.IsNullOrEmpty(this.Path) && this.Path.Length > 255) { this.AddError("Path", new Error(ErrorType.VALIDATION, "Path is longer than the maximum of 255 characters")); }
return (this.ErrorCount == 0);
}
#endregion
#region Public Methods
public ValidationList<IMedia> List(bool isLite, DataContext context) {
return List(isLite, 0, 0, context);
}
public ValidationList<IMedia> List(bool isLite, int skip, int top, DataContext context) {
if (context == null) { context = new DataContext(); }
var query = context.Medias.Where(x => x.DeletedOn == null);
List<Media> results;
if (skip > 0 || top > 0) {
if (top > 0) {
if (skip < 0) { skip = 0; }
results = query.OrderBy(x => x.ID).Skip(skip).Take(top).ToList();
} else {
results = query.OrderBy(x => x.ID).Skip(skip).ToList();
}
} else {
results = query.OrderBy(x => x.ID).ToList();
}
var finalResult = new ValidationList<IMedia>(new List<IMedia>());
foreach (var result in results) {
result.IsLite = isLite;
finalResult.Source.Add(result);
}
return finalResult;
}
public IMedia Get(long id, DataContext context) {
return Get(id, false, context);
}
public IMedia Get(long id, bool isLite, DataContext context) {
if (context == null) { context = new DataContext(); }
var results = context.Medias.Where(x => x.ID == id && x.DeletedOn == null).ToList();
var result = (results.Count > 0 ? results[0] : null);
if (result != null) {
result.IsLite = isLite;
}
return result;
}
#endregion
}
链接地址: http://www.djcxy.com/p/48591.html
上一篇: Ninject 2.1 ActivationException : Error activating string
下一篇: cms ImproperlyConfigured: Error importing middleware cms.middleware.media