2017-02-15 5 views
1

私はASP.NET Core、最新のMediatR、およびMediatR extension for Core's DIを使用しています。ASP.NETコア用にMediatRパイプラインハンドラを登録して使用するにはどうすればよいですか?

私は検証でパイプラインを設定しようとしています、using the official blog post。例is here

私はそのパイプラインクラスを登録/使用する方法を理解していません。別のblog postにこれを行う方法が示されていますが、私はそれがAutoFacのためだと思います。

組み込みのコンテナではどうすればよいですか?

答えて

6

あなたが言及した記事はMediatR 2.xを使用しています。
MediatR 3.0はまもなくリリースされ、パイプラインのサポートが組み込まれています。私はassociated documentationを読むことをお勧めします。

要するに、MediatRがIPipelineBehavior<TRequest, TResponse>を公開するようになりました。あなたのコンテナに登録したインスタンスは、ハンドラの構築時にMediatRによって自動的に検出されます。

は、ここではASP.NETコアのように見えることができるものです:

public class MyRequest : IRequest<string> 
{ 
} 

public class MyRequestHandler : IRequestHandler<MyRequest, string> 
{ 
    public string Handle(MyRequest message) 
    { 
     return "Hello!"; 
    } 
} 

public class TracingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> 
{ 
    public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next) 
    { 
     Trace.WriteLine("Before"); 
     var response = await next(); 
     Trace.WriteLine("After"); 

     return response; 
    } 
} 

非常にシンプルな、要求、ハンドラといくつかの「ログ」を行い行動。

登録はあまりにも、非常に簡単です:

var services = new ServiceCollection(); 
services.AddMediatR(typeof(Program)); 
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(TracingBehaviour<,>)); 
var provider = services.BuildServiceProvider(); 

var mediator = provider.GetRequiredService<IMediator>(); 

var response = await mediator.Send(new MyRequest()); 

それはIPipelineBehaviorの一般的な実装としてオープンジェネリックTracingBehaviorを登録するだけです。

+0

ハンドラがパイプラインにどのように関連付けられているのか不思議です。なぜなら、私はそれを試しただけで、自動的に動作するからです! – grokky

+1

MediatRは内部で行います。コンテナを介してリクエストハンドラを解決し、 'IPipelineBehavior'のすべてのインスタンスを解決し、すべてのビヘイビアがチェーンされ、チェーンの最後の要素が実際のハンドラであるパイプラインを作成します。興味があれば、['RequestHandlerImpl '](https://github.com/jbogard/MediatR/blob/bead0c683b8a001e2f796a623e04b1b333ca702c/src/MediatR/Internal/RequestHandler.cs#L64)クラスですべてのことが起こっていますコードを読む際に –

+0

私は、上記のパイプラインがすべての要求に対して呼び出されることに気付きました。そんなことになっていますか?複数のパイプラインを持つことはできません。たとえば、すべての要求ではなく、特定の要求のみを処理した検証用にパイプラインを作成することはできますか? – grokky

関連する問題