2010-11-02 2 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 인터페이스 및 Media 구현을 게시 할 수 있습니까? – Freshblood

답변

4

Ninject에는 Media .ctor에 삽입 할 "문자열 키"에 대한 바인딩이 없습니다. Media에 의존하는 형식을 만들려고 할 때 종속성을 해결하고 throw하는 방법을 알지 못합니다. 대부분의 유형에서 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 

} 
관련 문제