2010-11-02 67 views
7

我很困惑爲什麼我在隨機綁定中收到「Ninject.ActivationException:錯誤激活字符串沒有匹配的綁定可用,並且類型不可自行綁定」。如果我將IMedia的綁定放在適當的位置,它將拋出ActivationException,但如果我使用CallbackProvider,它就會起作用。所有這些類的結構都與幾個不同的屬性相同。我很困惑,爲什麼ILocationType,IMedia和IFarmDataContext會引發ActivationException,而其他的則不會。有任何想法嗎?Ninject 2.1 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>(); 
+0

你也可以發佈IMedia接口和媒體實施? – Freshblood 2010-11-03 00:33:13

回答

4

Ninject沒有綁定「String key」以注入Media .ctor;當它試圖創建一個依賴於媒體的類型時,它不知道如何解決依賴和拋出。對於大多數類型,Ninject會嘗試爲你創建一些東西,但是字符串和值類型不是可自我綁定的,因爲我們對它們沒有很好的默認值,它可能會對使用不同約定和基元的類型造成嚴重破壞。您需要在綁定(.WithContructorArgument(「key」,someValue))中添加參數值或使用某種提供程序(您已完成)。

0

下面是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 

}