iT邦幫忙

2022 iThome 鐵人賽

DAY 19
1
自我挑戰組

[Dot Net Core](圖解系列與常用套件)系列 第 19

[Dot Net Core](圖解系列) 19. MediatR - IRequest

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20220919/20144614JqCV9jsa4N.jpg

MediatR的使用範例可以由此得。

於 .Net Core ,會先註冊此套件:

https://ithelp.ithome.com.tw/upload/images/20220919/20144614FzGyMVsJ03.jpg

首先會起一個MediatRServiceConfiguration的實例,然後接著要呼叫 ServiceRegistrar.AddRequiredServices,
將 MediaR的相關如 IMediator、ISender、IPublisher、ServiceFactory 與 IPipelineBehavior 等註冊服務。

當呼叫 ServiceRegistrar.AddMediatRClasses ,將應用程式組件中,有實作 MediaR的相關介面類別註冊服務。
這些介面有 IRequestHandler<,>、INotificationHandler<>、IRequestPreProcessor<>、IRequestPostProcessor<,>與IRequestExceptionAction<,>等等。
要特別注意的是,介面會隨著GenericTypeArguments不同,就視同不一樣的服務,要註冊進來。
而GenericTypeArguments的不同也代表開發者決定那些類別要採用那些MediaR的相關介面。

[IRequest]
https://ithelp.ithome.com.tw/upload/images/20220919/20144614X1VbxPXHhP.jpg

在 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();
   }
}

運作過程如下:

https://ithelp.ithome.com.tw/upload/images/20220919/20144614sxbfjRlcDe.jpg

透過.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


上一篇
[Dot Net Core](應用延伸) 18.為何使用 Dot Net Core 框架 - 解耦服務搭配 API Gateway
下一篇
[Dot Net Core](圖解系列) 20. MediatR - INotification
系列文
[Dot Net Core](圖解系列與常用套件)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言