あなたが言及した記事は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
を登録するだけです。
ハンドラがパイプラインにどのように関連付けられているのか不思議です。なぜなら、私はそれを試しただけで、自動的に動作するからです! – grokky
MediatRは内部で行います。コンテナを介してリクエストハンドラを解決し、 'IPipelineBehavior'のすべてのインスタンスを解決し、すべてのビヘイビアがチェーンされ、チェーンの最後の要素が実際のハンドラであるパイプラインを作成します。興味があれば、['RequestHandlerImpl'](https://github.com/jbogard/MediatR/blob/bead0c683b8a001e2f796a623e04b1b333ca702c/src/MediatR/Internal/RequestHandler.cs#L64)クラスですべてのことが起こっていますコードを読む際に –
私は、上記のパイプラインがすべての要求に対して呼び出されることに気付きました。そんなことになっていますか?複数のパイプラインを持つことはできません。たとえば、すべての要求ではなく、特定の要求のみを処理した検証用にパイプラインを作成することはできますか? – grokky