Должности, о которых вы указали, используют 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());
Это просто вопрос регистрации открытого родовое TracingBehavior
как родовые реализации IPipelineBehavior
.
Мне любопытно, как обработчик связан с конвейером, потому что я просто попробовал, и он работает автоматически! – grokky
MediatR делает это внутренне. Он разрешает обработчик запроса через ваш контейнер, а затем разрешает все экземпляры «IPipelineBehavior» и создает конвейер, где все поведения привязаны, а последний элемент в цепочке является фактическим обработчиком. Все это происходит в классе ['RequestHandlerImpl'] (https://github.com/jbogard/MediatR/blob/bead0c683b8a001e2f796a623e04b1b333ca702c/src/MediatR/Internal/RequestHandler.cs#L64), если вы заинтересованы при чтении кода. –
Я только что понял, что вышеприведенный конвейер будет вызываться для ВСЕХ запросов. Предполагается, что это так? Могу ли я иметь несколько конвейеров и, например, иметь один для проверки, где он обрабатывал только определенные запросы, а не все запросы? – grokky