.NET Core开发实战(定义API的最佳实践)Source Generators版
前言
極客時間上的《.NET Core開發實戰》是一門非常好的課程,作者肖偉宇在第31課(https://time.geekbang.org/course/detail/100044601-201165)介紹了定義API的最佳實踐。
大意如下:
Controller這一層負責與前端用戶的交互,它主要的責任就是定義輸入和輸出,不應該處理業務。?
因此使用中介者模式,將業務邏輯和Controller進行隔離。
示例API的實現代碼如下:
[Route("api/[controller]")] [ApiController] public?class?OrderController?:?ControllerBase {IMediator?_mediator;public?OrderController(IMediator?mediator){_mediator?=?mediator;}[HttpPost]public?async?Task<long>?CreateOrder([FromBody]CreateOrderCommand?cmd){return?await?_mediator.Send(cmd,?HttpContext.RequestAborted);}[HttpGet]public?async?Task<List<string>>?QueryOrder([FromQuery]MyOrderQuery?myOrderQuery){return?await?_mediator.Send(myOrderQuery);} }public?class?CreateOrderCommand?:?IRequest<long> {public?CreateOrderCommand(int?itemCount){ItemCount?=?itemCount;}public?long?ItemCount?{?get;?private?set;?} }public?class?MyOrderQuery?:?IRequest<List<string>> {public?string?UserName?{?get;?set;?} }問題
按照上述的最佳實踐去編寫Controller,這就意味著,如果有100個命令和查詢,就要創建100個同樣格式的方法。
這是一項重復并且枯燥的工作,而且還必須保證方法返回值與IRequest<T>的類型一致,很容易出錯。
有不有不用寫這些代碼的簡單方式?
Source Generators
現在,可以祭出我們的大殺器——Source Generators。
上次我們已經使用它實現了AutoMapper,它的主要特點是自動生成源代碼并編譯到最終輸出中。
這次,我們用它來自動生成API代碼。
實現原理如下:
遍歷所有繼承IRequest<T>的類,并用它們名稱的第2個單詞(例如Order)分組
分組Key作為Controller的名稱
在Controller分組中遍歷分組下的類,生成對應命令和查詢方法
具體實現代碼請到https://github.com/feiyun0112/CodesForMy_IO下載。
使用示例
下載課件代碼(https://gitee.com/geektime-geekbang/NET-Core),在GeekTime.Ordering.API項目中引用ApiControllerGenerator項目,無需修改任何代碼,直接編譯,可以看到已經按照最佳實踐的規范生成了代碼(Controller名稱故意加了New以示區別):
運行后Swagger顯示正常,成功!
結論
現在,我們只需定義命令和查詢,即可實現定義API的最佳實踐,是不是很酷!
如果你覺得這篇文章對你有所啟發,請關注我的個人公眾號”My IO“,記住我!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的.NET Core开发实战(定义API的最佳实践)Source Generators版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# WPF MVVM项目实战(进阶②)
- 下一篇: 设计模式之桥接