0

Autofac 3.5 と MediatR を使用して、特定のインターフェイスを実装する閉じた型にデコレータを適用しようとしています。次のハンドラータイプがあります。

class ABCQueryHandler: IRequestHandler<GetBankStatementLinesQuery, BankStatementLine> 

そして、IRequestHandler<,> を実装するすべての型に、次の一般的なオープン デコレータ型を適用したいと思います。

class LoggingHandler<TRequest, TResponse> : IRequestHandler<TRequest, TResponse> 
    where TRequest : IRequest<TResponse>

私のAutofac構成は次のとおりです。

builder
    .RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
    .As(type => type.GetInterfaces()
        .Where(t => t.IsClosedTypeOf(typeof(IRequestHandler<,>)))
        .Select(t => new KeyedService("requestHandler", typeof(IRequestHandler<,>))))
    .InstancePerLifetimeScope();

builder.RegisterGenericDecorator(typeof(LoggingHandler<,>), typeof(IRequestHandler<,>), fromKey: "requestHandler")
    .InstancePerLifetimeScope();

閉じた型は注入されますが、LoggingHandler で装飾されることはありません。ここで何が欠けているのかわかりません。Autofac でのオープン ジェネリック登録のためにオープン ジェネリック デコレータを登録する方法は?に従っていくつかのアプローチを試しました。またはAutoFac - 開いている Generic の一部にデコレータを登録しますが、どれもうまくいきません。

4

1 に答える 1

3

オープンジェネリック型をに渡していKeyedServiceます。代わりに、次のようにクローズド ジェネリック型を渡す必要があります。

builder
    .RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
    .As(type => type.GetInterfaces()
        .Where(t => t.IsClosedTypeOf(typeof(IRequestHandler<,>)))
        .Select(t => new KeyedService("requestHandler", t)))
    .InstancePerLifetimeScope();
于 2016-10-05T08:33:25.423 に答える