您好,登錄后才能下訂單哦!
這篇文章主要介紹ASP.NET Core中動態(tài)WebApi的實(shí)現(xiàn)方法,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
一.前言
接觸到動態(tài)WebApi(Dynamic Web API)這個詞的已有幾年,是從ABP框架里面接觸到的,當(dāng)時便對ABP的這個技術(shù)很好奇,后面分析了一波,也嘗試過從ABP剝離一個出來作為獨(dú)立組件來使用,可是后來因與ABP依賴太多而放棄。十幾天前朋友 熊貓 將這部分代碼(我和他在搞事情)成功的從 ABP 中剝離出來并做了一個簡單Demo扔給我,經(jīng)過這么久(實(shí)在是太懶_)終于經(jīng)過一些修改、添加功能、封裝,現(xiàn)在已經(jīng)能作為一個獨(dú)立組件使用,項(xiàng)目開源在Github(https://github.com/dotnetauth/Panda.DynamicWebApi),希望覺得有用的朋友能給一個 Star 支持一下。
本文只講使用,不講原理,原理放到后面的文章中詳細(xì)介紹。
二.介紹
不管是傳統(tǒng)的三層架構(gòu)、 DDD 經(jīng)典四層架構(gòu)(DDD Lite),亦或是其他具有應(yīng)用邏輯層(業(yè)務(wù)邏輯層)的架構(gòu),在Web應(yīng)用程序開發(fā)當(dāng)中 ,我們的業(yè)務(wù)邏輯最終都需要經(jīng)過 Web Api 來進(jìn)行調(diào)用,這里我們可能會有一個重復(fù)的操作:編寫業(yè)務(wù)邏輯->編寫API調(diào)用業(yè)務(wù)邏輯,這種重復(fù)性的操作有沒有解決辦法呢,我們編寫完業(yè)務(wù)邏輯以后便給我們自動生成WebApi,答案當(dāng)然是有的。
這里介紹一下本文的主角:Panda.DynamicWebApi
(https://github.com/dotnetauth/Panda.DynamicWebApi)。源自于ABP的一個可獨(dú)立使用的,可自動為你的業(yè)務(wù)邏輯層生成 ASP.NET Core WebApi 層的開源組件。它生成的API符合Restful風(fēng)格,可以根據(jù)符合條件的類來生成WebApi,由MVC框架直接調(diào)用邏輯,無性能問題,完美兼容Swagger來構(gòu)建API說明文檔。
三.使用
這里以 DDD 經(jīng)典四層架構(gòu)中的應(yīng)用邏輯層來講解。
1.準(zhǔn)備
(1)建立兩個項(xiàng)目一個是應(yīng)用邏輯層類庫項(xiàng)目;一個是作為生成WebApi Host,ASP.NET Core WebApi項(xiàng)目
(2)編寫應(yīng)用邏輯
定義一個應(yīng)用邏輯接口,所有應(yīng)用邏輯都應(yīng)實(shí)現(xiàn)它:
public interface IApplicationService { }
定義一個學(xué)生管理邏輯接口,繼承應(yīng)用邏輯接口
public interface IStudentAppService : IApplicationService { /// <summary> /// 根據(jù)ID獲取學(xué)生 /// </summary> /// <param name="id"></param> /// <returns></returns> StudentOutput Get(int id); /// <summary> /// 獲取所有學(xué)生 /// </summary> /// <returns></returns> List<StudentOutput> Get(); /// <summary> /// 更新學(xué)生信息 /// </summary> /// <param name="input"></param> void Update(UpdateStudentInput input); /// <summary> /// 更新學(xué)生年齡 /// </summary> /// <param name="age"></param> void UpdateAge(int age); /// <summary> /// 根據(jù)ID刪除學(xué)生 /// </summary> /// <param name="id"></param> void Delete(int id); /// <summary> /// 添加學(xué)生 /// </summary> /// <param name="input"></param> void Create(CreateStudentInput input); }
實(shí)現(xiàn)學(xué)生邏輯管理接口:
public class StudentAppService: IStudentAppService { /// <summary> /// 根據(jù)ID獲取學(xué)生 /// </summary> /// <param name="id"></param> /// <returns></returns> [HttpGet("{id:int}")] public StudentOutput Get(int id) { return new StudentOutput() {Id = 1, Age = 18, Name = "張三"}; } /// <summary> /// 獲取所有學(xué)生 /// </summary> /// <returns></returns> public List<StudentOutput> Get() { return new List<StudentOutput>() { new StudentOutput(){Id = 1,Age = 18,Name = "張三"}, new StudentOutput(){Id = 2,Age = 19,Name = "李四"} }; } /// <summary> /// 更新學(xué)生信息 /// </summary> /// <param name="input"></param> public void Update(UpdateStudentInput input) { throw new System.NotImplementedException(); } /// <summary> /// 更新學(xué)生年齡 /// </summary> /// <param name="age"></param> [HttpPatch("{id:int}/age")] public void UpdateAge(int age) { throw new System.NotImplementedException(); } /// <summary> /// 根據(jù)ID刪除學(xué)生 /// </summary> /// <param name="id"></param> [HttpDelete("{id:int}")] public void Delete(int id) { throw new System.NotImplementedException(); } /// <summary> /// 添加學(xué)生 /// </summary> /// <param name="input"></param> public void Create(CreateStudentInput input) { throw new System.NotImplementedException(); } }
(3)給 WebApi Host 項(xiàng)目配置 Swagger。
Install-Package Swashbuckle.AspNetCore -Version 4.0.1
Startup 中配置
public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new Info { Title = "曉晨學(xué)生管理系統(tǒng) WebApi", Version = "v1" }); options.DocInclusionPredicate((docName, description) => true); options.IncludeXmlComments(@"bin\Debug\netcoreapp2.2\Xc.StuMgr.WebApiHost.xml"); options.IncludeXmlComments(@"bin\Debug\netcoreapp2.2\Xc.StuMgr.Application.xml"); }); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "曉晨學(xué)生管理系統(tǒng) WebApi"); }); app.UseMvc(); }
運(yùn)行則會直接看到默認(rèn)的 ValuesController 的5個API。
2.動態(tài)WebApi
通過Nuget 為 Application 項(xiàng)目安裝組件:
Install-Package Panda.DynamicWebApi
為接口 IApplicationService
繼承 IDynamicWebApi
同時添加特性DynamicWebApi
[DynamicWebApi] public interface IApplicationService:IDynamicWebApi { }
在 WebApi Host 項(xiàng)目中,Startup里配置動態(tài)WebApi:
Startup.cs:
// 添加動態(tài)WebApi 需放在 AddMvc 之后 services.AddDynamicWebApi();
然后打開瀏覽器訪問將會看到:
可以看到成功為我們的 StudentAppService
生成了WebApi,并且和Swagger完美兼容。
四.詳細(xì)介紹
經(jīng)過上面的介紹,大家應(yīng)該可以看出使用是非常簡單的,只需兩步:
第一步:為你的類(或者該類的接口、該類繼承的抽象類,不得放在該類除前面兩種情況的父類上)繼承 IDynamicWebApi
接口并加入特性[DynamicWebApi]
第二步:Startup中注冊
// 添加動態(tài)WebApi 需放在 AddMvc 之后 services.AddDynamicWebApi();
因?yàn)樾枰狹VC的一些類來進(jìn)行處理,所以必須放在AddMvc之后,本組件有檢查。
1.規(guī)則
本組件采用約定大于配置,所以在實(shí)際使用中有幾個規(guī)則:
(1)要讓類生成動態(tài)API需要滿足兩個條件,一個是該類直接或間接實(shí)現(xiàn) IDynamicWebApi
,同時該類本身或者父抽象類或者實(shí)現(xiàn)的接口具有特性 DynamicWebApi
(2)添加特性 [NonDynamicWebApi]
可使一個類或者一個方法不生成API,[NonDynamicWebApi]
具有最高的優(yōu)先級。
(3)會對符合規(guī)則的動態(tài)API類名進(jìn)行后綴的刪除,如:我們前面的 StudentAppService
,會被刪除 AppService 后綴,這個規(guī)則是可以動態(tài)配置的。
(4)會自動添加API路由前綴,默認(rèn)會為所有API添加 api
前綴
等ASP.NET Core 內(nèi)置特性來覆蓋
(6)可以通過HttpGet/HttpPost/HttpDelete
等內(nèi)置特性來覆蓋默認(rèn)路由
(7)默認(rèn)會根據(jù)你的方法名字來設(shè)置HTTP動詞,如 CreateApple 或者 Create 生成的API動詞為 POST
,對照表如下,若命中(忽略大小寫)對照表那么該API的名稱中的這個動詞將會被省略,如 CreateApple 將會變成 Apple,如未在以下對照表中,將會使用默認(rèn)動詞 POST
方法名開頭 | 動詞 |
---|---|
create | POST |
add | POST |
post | POST |
get | GET |
find | GET |
fetch | GET |
query | GET |
update | PUT |
put | PUT |
delete | DELETE |
remove | DELETE |
(8)強(qiáng)烈建議方法名稱使用帕斯卡命名(PascalCase)規(guī)范,以更好的自動處理API名稱,且使用以上對照表的動詞。如:
添加蘋果 -> Add/AddApple/Create/CreateApple
更新蘋果 -> Update/UpdateApple
...
(9)[DynamicWebApi]
特性因?yàn)榭杀焕^承,所以為了父類被誤識別,禁止放在除抽象類、接口以外的父類上。
2.配置
所有的配置均在對象 DynamicWebApiOptions
中,說明如下:
屬性名 | 是否必須 | 說明 |
---|---|---|
DefaultHttpVerb | 否 | 默認(rèn)值:POST。默認(rèn)HTTP動詞 |
DefaultAreaName | 否 | 默認(rèn)值:空。Area 路由名稱 |
DefaultApiPrefix | 否 | 默認(rèn)值:api。API路由前綴 |
RemoveControllerPostfixes | 否 | 默認(rèn)值:AppService/ApplicationService。類名需要移除的后綴 |
RemoveActionPostfixes | 否 | 默認(rèn)值:Async。方法名需要移除的后綴 |
FormBodyBindingIgnoredTypes | 否 | 默認(rèn)值:IFormFile。不通過MVC綁定到參數(shù)列表的類型。 |
以上是“ASP.NET Core中動態(tài)WebApi的實(shí)現(xiàn)方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。