iT邦幫忙

2022 iThome 鐵人賽

DAY 21
1
自我挑戰組

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

[Dot Net Core](圖解系列) 21. MediatR - PreProcess and PostProcess

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20220921/20144614gcasDVKbVE.jpg

MediatR-IRequest的內容中,展示了 IRequest的運作,如下圖示意:

https://ithelp.ithome.com.tw/upload/images/20220921/20144614YW43GxyJTx.jpg

與運作展示:
https://ithelp.ithome.com.tw/upload/images/20220921/20144614647mMzkIym.jpg

運作末段(上圖右下)有PreProcess 與 PostProcess,前置preprocess可以做的事情如寫log、資料檢核驗證等,後置則可以做的事情如寫log、交易紀錄存DB等。

假設我們以執行以下為例:

var result = await _mediator.Send(new GetCustomersQuery());

而類別繼承了介面IRequest,Customer為其中的data model傳遞資料媒介:

public class GetCustomersQuery : IRequest<List<Customer>>
{

    public void PreProcess()
	{
		PreProcessCollection.Instance[PreProcessCollection.Instance.Count] =
						new { datetime = DateTime.Now, Message = "do pre-process stuff....." };
	}

	public void PostProcess(int count)
	{
		PostProcessCollection.Instance[PostProcessCollection.Instance.Count] = 
						new { datetime = DateTime.Now, Message = $" do post-process stuff.....result total number is {count}" };
	}


}

執行的Handler類別:

public class GetCustomersQueryHandler : IRequestHandler<GetCustomersQuery, List<Customer>>
{       
   public async Task<List<Customer>> Handle(GetCustomersQuery request, CancellationToken cancellationToken)
   {
     return _repository.GetAll<Customer>().ToList();
   }
}

與之前的例子不同的是,在 [IRequest] 中,其中第五步驟,利用 ServiceFactory 從已註冊的服務 IPipelineBehavior<TRequest, TResponse> 實現實體,並結合IRequestHandler<GetCustomersQuery, List>實體 ,將這些實體依序執行其Handle函式。

執行的順序為 RequestPreProcessorBehavior.Handle -> GetCustomersQueryHandler.Handle -> RequestExceptionProcessorBehavior.Handle -> RequestExceptionActionProcessorBehavior.Handle -> RequestPostProcessorBehavior.Handle

而 RequestPreProcessorBehavior.Handle 、RequestPostProcessorBehavior.Handle 為最先與最末會執行到的,所以可以加以利用分別來做前置、收尾的動作。

ServiceFactory 從已註冊的服務 IPipelineBehavior<TRequest, TResponse> 實現實體時,其建構子也會被注入服務。
RequestPreProcessorBehavior 會注入 IRequestPreProcessor 實體, RequestPostProcessorBehavior 會注入 IRequestPostProcessor<TRequest, TResponse>實體。

所以開發者就可以針對此二服務去做類別的設計。


上一篇
[Dot Net Core](圖解系列) 20. MediatR - INotification
下一篇
[Dot Net Core](延伸應用) 22. Event-driven Application - Using Queue to simulate operation
系列文
[Dot Net Core](圖解系列與常用套件)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言