2016-07-22 10 views
2

依存性注入のために城ウィンザーを使用し、いくつかの一般的なタイプを注入しようとしています。しかし、コンテナで解決を呼び出すと、次のエラーが発生します。城ウィンザー - 車は実装タイプの一般的な制約を満たさない

クラスは実装タイプの一般的な制約を満たしていません。

この例では、現時点で単純な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 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"); 

である私のインストーラ

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()); 
} 

です高く評価された

答えて

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

関連する問題