2017-02-15 12 views
1

Я использую ASP.NET Core, последние MediatR и MediatR extension for Core's DI.Как зарегистрировать и использовать обработчик конвейера MediatR для ASP.NET Core?

Я пытаюсь настроить трубопровод с валидацией, 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()); 

Это просто вопрос регистрации открытого родовое TracingBehavior как родовые реализации IPipelineBehavior.

+0

Мне любопытно, как обработчик связан с конвейером, потому что я просто попробовал, и он работает автоматически! – grokky

+1

MediatR делает это внутренне. Он разрешает обработчик запроса через ваш контейнер, а затем разрешает все экземпляры «IPipelineBehavior» и создает конвейер, где все поведения привязаны, а последний элемент в цепочке является фактическим обработчиком. Все это происходит в классе ['RequestHandlerImpl '] (https://github.com/jbogard/MediatR/blob/bead0c683b8a001e2f796a623e04b1b333ca702c/src/MediatR/Internal/RequestHandler.cs#L64), если вы заинтересованы при чтении кода. –

+0

Я только что понял, что вышеприведенный конвейер будет вызываться для ВСЕХ запросов. Предполагается, что это так? Могу ли я иметь несколько конвейеров и, например, иметь один для проверки, где он обрабатывал только определенные запросы, а не все запросы? – grokky