2010-11-02 30 views
7

Tôi nhầm lẫn về lý do tại sao tôi nhận được "Ninject.ActivationException: Error Activating string Không có kết hợp phù hợp nào có sẵn và loại không tự ràng buộc" trong các kết buộc ngẫu nhiên. Nếu tôi để ràng buộc cho IMedia tại chỗ nó sẽ ném ActivationException, nhưng nếu tôi sử dụng CallbackProvider nó hoạt động. Tất cả các lớp này được cấu trúc giống nhau với một vài thuộc tính khác nhau. Tôi đang bối rối là tại sao ILocationType, IMedia, và IFarmDataContext ném ActivationException trong khi những người khác thì không. Bất kỳ ý tưởng?Ninject 2.1 ActivationException: Lỗi kích hoạt chuỗi

/****************************** 
* 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

Bạn cũng có thể đăng giao diện IMedia và Triển khai phương tiện không? – Freshblood

Trả lời

4

Ninject không có ràng buộc cho "Chuỗi khóa" để chèn vào Media .ctor; Khi nó cố tạo một kiểu phụ thuộc vào Media, nó không biết cách giải quyết sự phụ thuộc và ném. Đối với hầu hết các loại, Ninject sẽ cố gắng tạo ra thứ gì đó cho bạn, nhưng các kiểu chuỗi và giá trị không tự ràng buộc vì chúng tôi không có giá trị mặc định tốt cho chúng và nó có thể gây ra các loại sử dụng các quy ước khác nhau với nguyên thủy.

Bạn cần thêm giá trị tham số vào các liên kết (.WithContructorArgument ("key", someValue)) hoặc sử dụng một số loại nhà cung cấp (mà bạn đã thực hiện).

0

Dưới đây là giao diện IMedia và Triển khai phương tiện. Phương tiện là một phần lớp với lớp chính được tạo ra thông qua tệp LinqToSql DBML. Đây là trường hợp cho tất cả các loại được liệt kê ở trên trong danh sách các ràng buộc.

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 

} 
Các vấn đề liên quan