2

LightInject と MediatR を使用して汎用リクエスト ハンドラーを作成しようとしています。基本的に、次のようなタイプがあります。

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

そしてHandler、次のように自分の型を LightInject コンテナに登録しました。

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

しかし、メディエーターを呼び出して の実装を試みると、IAsyncRequestHandler<InheritedType,SomeResponseType>失敗します。実装Handler以来、登録を取得することを期待していたでしょう。InheritedTypeSomeType

ここで何か間違ったことをしていますか、または上記の動作を LightInject で実現する方法はありますか?


不明な点がある場合はお知らせください。詳しい情報を提供できるよう努めます。ありがとう!

4

1 に答える 1

3

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>>();
于 2016-09-09T18:29:13.780 に答える