2016-09-09 7 views
1

LightInjectとMediatRを使ってジェネリックリクエストハンドラを構築しようとしています。基本的に、私は次のような種類があります。LightInjectは継承したジェネリック型を解決しません

public class SomeType { } 
public class InheritedType : SomeType { } 
public class Handler : IAsyncRequestHandler<SomeType, SomeResponseType> { } 

をそして私はそうのような私のLightInject容器の中に私のHandlerタイプを登録している:

registry.RegisterAssembly(typeof(SomeType).Assembly, (s, type) => 
      !s.IsClass && type.IsAssignableToGenericType(typeof(IAsyncRequestHandler<,>) 
      ); 

をしかし、私がしようとしたときとするために、私の仲介者に呼び出しますの実装では、失敗します。 InheritedTypeSomeTypeを実装して以来、私は登録されたHandlerを得ることになるでしょう。

私はここで何か間違っているのですか、LightInjectに上記の動作を達成する方法がありますか?


明確ではないと私に教えてください。ありがとう!

答えて

2

Handlerクラスは汎用引数の両方を閉じます。後で変更することはできません。 Handlerクラスの新しいインスタンスを手動で作成しようとすると、閉じられているため汎用引数を指定する方法がないことがわかります。

コードをこれに変更します。

public class Handler<T, SomeResponseType> : IAsyncRequestHandler<T, SomeResponseType> where T:IAsyncRequest<SomeResponseType> 
{ 
    public Task<SomeResponseType> Handle(T message) 
    { 
     throw new NotImplementedException(); 
    } 
} 

登録すると、これは

var container = new ServiceContainer();    
container.Register(typeof(IAsyncRequestHandler<,>), typeof(Handler<,>)); 
var instance = container.GetInstance<IAsyncRequestHandler<InheritedType, SomeResponseType>>(); 
+0

私はそれaroudnジェネリック医薬品の余分な層を回避するための別の方法を働くことになったように解決するが、良い情報を知るために、ありがとう!そして、素晴らしいライブラリのおかげで! – agc93

関連する問題