2016-07-22 81 views
2

Im的泛型約束。但是,當我呼叫解決我的容器時,我得到以下錯誤 -城堡溫莎 - 汽車不使用溫莎城堡的扶養注射,並試圖注入一些泛型類型滿足實現類型

類不滿足實現類型的通用約束。

在這個例子中,我正在傳遞一個簡單的Car類型。

public class CreateRequestInstance<T> where T : class, ICreateRequestInstance<T> 
{ 
    private IRequestObject<T> _IRequestObject; 

    public CreateRequestInstance(IRequestObject<T> requestObject) 
    { 
     this._IRequestObject = requestObject; 
    } 

    public TReturn CreateRequest<TReturn>(string provider, string type, string token, T request, 
     string revision, string errorCode, string errorMessage) 
    { 
     _IRequestObject.Provider = provider; 
     _IRequestObject.Type = type; 
     _IRequestObject.Token = token; 
     _IRequestObject.Request = request; 
     _IRequestObject.ErrorCode = errorCode; 
     _IRequestObject.ErrorMessage = errorMessage; 

     return (TReturn)Convert.ChangeType(_IRequestObject, typeof(IRequestObject<T>)); 
    } 
} 

這是我安裝

public void Install(IWindsorContainer container, IConfigurationStore store) 
{ 
    container 
     .Register(Component 
      .For(typeof(ICreateRequestInstance<>)) 
      .ImplementedBy(typeof(CreateRequestInstance<>)) 
      .LifestyleTransient()) 
     .Register(Component 
      .For(typeof(ICreateResponseInstance<>)) 
      .ImplementedBy(typeof(CreateResponseInstance<>)) 
      .LifestyleTransient()) 
     .Register(Component 
      .For(typeof(IRequestObject<>)) 
      .ImplementedBy(typeof(RequestObject<>)) 
      .LifestyleTransient()) 
     .Register(Component 
      .For(typeof(IResponseObject<>)) 
      .ImplementedBy(typeof(ResponseObject<>)) 
      .LifestyleTransient()); 
} 

這是我的類工廠調用

public T GetConcreteClass<T>() 
{ 
    var someClass = container.Resolve<T>(); 
    return someClass; 
} 

,這是調用代碼

var t = factory.GetConcreteClass<ICreateRequestInstance<ICar>>(); 

var test = t.CreateRequest<ICar>("provide", "test", "test", car, "1", "this is a test", "fred"); 

任何幫助,這將是讚賞

回答

4
public class CreateRequestInstance<T> where T : class, ICreateRequestInstance<T> 

這看起來不正確的。你宣稱需要一個模板參數是實現ICreateRequestInstance<T>一類的類。有了這個,你會除非你的Car類型實現ICreateRequestInstance<T>(我懷疑它),讓你看到的錯誤。

我覺得你真的打算:

public class CreateRequestInstance<T> : ICreateRequestInstance<T> where T : class 

這是實現ICreateRequestInstance<T>期望一個模板參數是任何類的類。

+0

謝謝。我製作了你建議的開關,並刪除了通用約束,並且它工作正常 – chrisblue13