MediatR的使用範例可以由此取得。
於 .Net Core ,會先註冊此套件:
首先會起一個MediatRServiceConfiguration的實例,然後接著要呼叫 ServiceRegistrar.AddRequiredServices,
將 MediaR的相關如 IMediator、ISender、IPublisher、ServiceFactory 與 IPipelineBehavior 等註冊服務。
當呼叫 ServiceRegistrar.AddMediatRClasses ,將應用程式組件中,有實作 MediaR的相關介面類別註冊服務。
這些介面有 IRequestHandler<,>、INotificationHandler<>、IRequestPreProcessor<>、IRequestPostProcessor<,>與IRequestExceptionAction<,>等等。
要特別注意的是,介面會隨著GenericTypeArguments不同,就視同不一樣的服務,要註冊進來。
而GenericTypeArguments的不同也代表開發者決定那些類別要採用那些MediaR的相關介面。
[IRequest]
在 ConfigureServices 中,執行Service. AddMediatR(typeof(Startup))。
Service.AddMediatR(typeof(Startup))
假設我們以執行
var result = await _mediator.Send(new GetCustomersQuery());
為例。
而類別繼承了介面IRequest,Customer為其中的data model傳遞資料媒介:
public class GetCustomersQuery : IRequest<List<Customer>>
{
}
執行的Handler類別:
public class GetCustomersQueryHandler : IRequestHandler<GetCustomersQuery, List<Customer>>
{
public async Task<List<Customer>> Handle(GetCustomersQuery request, CancellationToken cancellationToken)
{
return _repository.GetAll<Customer>().ToList();
}
}
運作過程如下:
透過.net Core 的 DI 機制,可以在controller建構子取到 Mediator,與其中的欄位 ServiceFactory。
之後會用多次處理Type與Instance對應實體的處理。
接著圖中有幾個步驟:
第一,直接新增實例 RequestHandlerWrapperImpl<TRequest, TResponse> ,這邊的範例 TRequest 是 IRequestHandler<GetCustomersQuery, List>,TResponse 是 List。
第二,將 ServiceFactory 委派為由Dot Net Core 框架中的 IServiceProvider.GetService 經由註冊好的服務產生實例。
第三,執行 RequestHandlerWrapperImpl 的 Handle 。
第四,會呼叫 RequestHandlerWrapperImpl 最上層父類別 RequestHandlerBase 的 GetHandle,利用 ServiceFactory 從已註冊的服務
IRequestHandler<TRequest, TResponse> 實現實體,這也是由開發者所建立的類別。
第五,利用 ServiceFactory 從已註冊的服務 IPipelineBehavior<TRequest, TResponse> 實現實體,並結合IRequestHandler<GetCustomersQuery, List>實體 ,將這些實體依序執行其Handle函式。
執行的順序為 RequestPreProcessorBehavior.Handle -> GetCustomersQueryHandler.Handle -> RequestExceptionProcessorBehavior.Handle -> RequestExceptionActionProcessorBehavior.Handle -> RequestPostProcessorBehavior.Handle