在 MediatR-IRequest的內容中,展示了 IRequest的運作,如下圖示意:
與運作展示:
運作末段(上圖右下)有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>實體。
所以開發者就可以針對此二服務去做類別的設計。