使用Brighter实现轻量型独立管道
前言
上次,我們介紹了使用MediatR的Behaviors功能,在業(yè)務(wù)層實現(xiàn)管道模式。(《為什么應(yīng)該在業(yè)務(wù)層實現(xiàn)管道模式,而不用ASP.NET Core Middleware實現(xiàn) | 2點原因和實現(xiàn)方式》)
但是,這種管道有個特點或者說缺點,不管你需不需要,所有請求都要經(jīng)過管道處理,而且處理順序必須一致。
下面,我們介紹一種更輕量的實現(xiàn)方式。
Brighter
Brighter一個命令處理器和調(diào)度程序?qū)崿F(xiàn),支持任務(wù)隊列的輕量級類庫。
它的使用方式和MediatR類似,同樣可以實現(xiàn)業(yè)務(wù)邏輯和Controller進行隔離。
1.引用nuget包
創(chuàng)建Web API項目,并引用nuget包Paramore.Brighter.AspNetCore。
2.定義請求數(shù)據(jù)
添加一個新類DemoCommand,實現(xiàn)IRequest接口:
public?class?DemoCommand?:?IRequest {public?Guid?Id?{?get;?set;?}public?string?Name?{?get;?set;?} }3.實現(xiàn)請求處理程序
添加一個新類DemoCommandHandler,繼承基類RequestHandler<TRequest>,TRequest對應(yīng)實現(xiàn)了IRequest接口的類:
public?class?DemoCommandHandler?:?RequestHandler<DemoCommand> {public?override?DemoCommand?Handle(DemoCommand?command){Console.WriteLine("DemoQueryHandler執(zhí)行");return?base.Handle(command);} }4.實現(xiàn)API
Controller沒有任何業(yè)務(wù)邏輯,僅將請求通過commandProcessor發(fā)送:
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發(fā)送給請求處理程序處理。
實現(xiàn)獨立管道
Brighter提供了一種被稱為俄羅斯套娃的模型,可以將多個RequestHandler串聯(lián)起來執(zhí)行同一個請求,比如為DemoCommandHandler加上LogHandler(寫日志)和ValidateHandler(檢查請求參數(shù)合法性)。
這就相當于為每個請求處理程序提供了一條獨立管道。
要實現(xiàn)俄羅斯套娃,我們必須創(chuàng)建一個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執(zhí)行");return?base.Handle(request);} }step 定義在管道中的執(zhí)行順序
timing 在請求處理程序之前還是之后執(zhí)行
GetHandlerType() 返回具體處理方法的實現(xiàn),同樣要繼承自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的設(shè)置相同:
結(jié)論
通過本文,我們可以了解到,Brighter可以為每個請求實現(xiàn)獨立的管道,這樣可以更靈活地控制管道執(zhí)行的內(nèi)容和順序。
想了解更多內(nèi)容,請關(guān)注我的個人公眾號”My IO“
總結(jié)
以上是生活随笔為你收集整理的使用Brighter实现轻量型独立管道的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux和Windows下部署Beet
- 下一篇: [有奖励]GeneralUpdate开源