日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用Brighter实现轻量型独立管道

發(fā)布時間:2023/12/4 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Brighter实现轻量型独立管道 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

上次,我們介紹了使用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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。