使用Brighter实现轻量型独立管道
前言
上次,我們介紹了使用MediatR的Behaviors功能,在業務層實現管道模式。(《為什么應該在業務層實現管道模式,而不用ASP.NET Core Middleware實現 | 2點原因和實現方式》)
但是,這種管道有個特點或者說缺點,不管你需不需要,所有請求都要經過管道處理,而且處理順序必須一致。
下面,我們介紹一種更輕量的實現方式。
Brighter
Brighter一個命令處理器和調度程序實現,支持任務隊列的輕量級類庫。
它的使用方式和MediatR類似,同樣可以實現業務邏輯和Controller進行隔離。
1.引用nuget包
創建Web API項目,并引用nuget包Paramore.Brighter.AspNetCore。
2.定義請求數據
添加一個新類DemoCommand,實現IRequest接口:
public?class?DemoCommand?:?IRequest {public?Guid?Id?{?get;?set;?}public?string?Name?{?get;?set;?} }3.實現請求處理程序
添加一個新類DemoCommandHandler,繼承基類RequestHandler<TRequest>,TRequest對應實現了IRequest接口的類:
public?class?DemoCommandHandler?:?RequestHandler<DemoCommand> {public?override?DemoCommand?Handle(DemoCommand?command){Console.WriteLine("DemoQueryHandler執行");return?base.Handle(command);} }4.實現API
Controller沒有任何業務邏輯,僅將請求通過commandProcessor發送:
private?readonly?IAmACommandProcessor?_commandProcessor; public?WeatherForecastController(IAmACommandProcessor?commandProcessor) {_commandProcessor?=?commandProcessor; }[HttpPost] public?void?Demo(DemoCommand?command) {_commandProcessor.Send(command); }5.添加Brighter配置
打開Startup.cs,在ConfigureServices方法中,添加如下代碼:
services.AddBrighter().HandlersFromAssemblies(typeof(Startup).Assembly);6.運行
運行程序,訪問API地址,可以看到輸出正常,說明請求已通過Brighter發送給請求處理程序處理。
實現獨立管道
Brighter提供了一種被稱為俄羅斯套娃的模型,可以將多個RequestHandler串聯起來執行同一個請求,比如為DemoCommandHandler加上LogHandler(寫日志)和ValidateHandler(檢查請求參數合法性)。
這就相當于為每個請求處理程序提供了一條獨立管道。
要實現俄羅斯套娃,我們必須創建一個Attribute來繼承RequestLoggingAttribute:
public?class?FirstPipelineAttribute:?RequestHandlerAttribute {public?FirstPipelineAttribute(int?step,?HandlerTiming?timing):?base(step,?timing){?}public?override?Type?GetHandlerType(){return?typeof(FirstPipelineHandler<>);} }public?class?FirstPipelineHandler<TRequest>?:?RequestHandler<TRequest>?where?TRequest:?class,?IRequest {public?override?TRequest?Handle(TRequest?request){Console.WriteLine("FirstPipelineHandler執行");return?base.Handle(request);} }step 定義在管道中的執行順序
timing 在請求處理程序之前還是之后執行
GetHandlerType() 返回具體處理方法的實現,同樣要繼承自RequestHandler<TRequest>
然后在具體的Handle聲明這些Attribute:
[FirstPipeline(1,?HandlerTiming.Before)] [SecondPipeline(2,?HandlerTiming.Before,?typeof(SecondPipelineHandler<>))] [SecondPipeline(3,?HandlerTiming.After,?typeof(ThirdPipelineHandler<>))] public?override?DemoCommand?Handle(DemoCommand?command)可以看到,管道的處理順序和step、timing的設置相同:
結論
通過本文,我們可以了解到,Brighter可以為每個請求實現獨立的管道,這樣可以更靈活地控制管道執行的內容和順序。
想了解更多內容,請關注我的個人公眾號”My IO“
總結
以上是生活随笔為你收集整理的使用Brighter实现轻量型独立管道的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux和Windows下部署Beet
- 下一篇: [有奖励]GeneralUpdate开源