亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

ASP.NET Core奇淫技巧之動(dòng)態(tài)WebApi的實(shí)現(xiàn)

 更新時(shí)間:2020年08月14日 10:49:51   作者:曉晨Master  
這篇文章主要介紹了ASP.NET Core奇淫技巧之動(dòng)態(tài)WebApi的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一.前言

接觸到動(dòng)態(tài)WebApi(Dynamic Web API)這個(gè)詞的已有幾年,是從ABP框架里面接觸到的,當(dāng)時(shí)便對(duì)ABP的這個(gè)技術(shù)很好奇,后面分析了一波,也嘗試過(guò)從ABP剝離一個(gè)出來(lái)作為獨(dú)立組件來(lái)使用,可是后來(lái)因與ABP依賴(lài)太多而放棄。十幾天前朋友 熊貓 將這部分代碼(我和他在搞事情)成功的從 ABP 中剝離出來(lái)并做了一個(gè)簡(jiǎn)單Demo扔給我,經(jīng)過(guò)這么久(實(shí)在是太懶_)終于經(jīng)過(guò)一些修改、添加功能、封裝,現(xiàn)在已經(jīng)能作為一個(gè)獨(dú)立組件使用,項(xiàng)目開(kāi)源在Github(https://github.com/dotnetauth/Panda.DynamicWebApi),希望覺(jué)得有用的朋友能給一個(gè) Star 支持一下。

本文只講使用,不講原理,原理放到后面的文章中詳細(xì)介紹。

二.介紹

不管是傳統(tǒng)的三層架構(gòu)、 DDD 經(jīng)典四層架構(gòu)(DDD Lite),亦或是其他具有應(yīng)用邏輯層(業(yè)務(wù)邏輯層)的架構(gòu),在Web應(yīng)用程序開(kāi)發(fā)當(dāng)中 ,我們的業(yè)務(wù)邏輯最終都需要經(jīng)過(guò) Web Api 來(lái)進(jìn)行調(diào)用,這里我們可能會(huì)有一個(gè)重復(fù)的操作:編寫(xiě)業(yè)務(wù)邏輯->編寫(xiě)API調(diào)用業(yè)務(wù)邏輯,這種重復(fù)性的操作有沒(méi)有解決辦法呢,我們編寫(xiě)完業(yè)務(wù)邏輯以后便給我們自動(dòng)生成WebApi,答案當(dāng)然是有的。

這里介紹一下本文的主角:Panda.DynamicWebApihttps://github.com/dotnetauth/Panda.DynamicWebApi)。源自于ABP的一個(gè)可獨(dú)立使用的,可自動(dòng)為你的業(yè)務(wù)邏輯層生成 ASP.NET Core WebApi 層的開(kāi)源組件。它生成的API符合Restful風(fēng)格,可以根據(jù)符合條件的類(lèi)來(lái)生成WebApi,由MVC框架直接調(diào)用邏輯,無(wú)性能問(wèn)題,完美兼容Swagger來(lái)構(gòu)建API說(shuō)明文檔。

三.使用

這里以 DDD 經(jīng)典四層架構(gòu)中的應(yīng)用邏輯層來(lái)講解。

1.準(zhǔn)備

(1)建立兩個(gè)項(xiàng)目一個(gè)是應(yīng)用邏輯層類(lèi)庫(kù)項(xiàng)目;一個(gè)是作為生成WebApi Host,ASP.NET Core WebApi項(xiàng)目

(2)編寫(xiě)應(yīng)用邏輯

定義一個(gè)應(yīng)用邏輯接口,所有應(yīng)用邏輯都應(yīng)實(shí)現(xiàn)它:

public interface IApplicationService
{
}

定義一個(gè)學(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)行則會(huì)直接看到默認(rèn)的 ValuesController 的5個(gè)API。

2.動(dòng)態(tài)WebApi

通過(guò)Nuget 為 Application 項(xiàng)目安裝組件:

Install-Package Panda.DynamicWebApi

為接口 IApplicationService繼承 IDynamicWebApi同時(shí)添加特性DynamicWebApi

[DynamicWebApi]
public interface IApplicationService:IDynamicWebApi
{
}

在 WebApi Host 項(xiàng)目中,Startup里配置動(dòng)態(tài)WebApi:

Startup.cs:

// 添加動(dòng)態(tài)WebApi 需放在 AddMvc 之后
services.AddDynamicWebApi();

然后打開(kāi)瀏覽器訪問(wèn)將會(huì)看到:

可以看到成功為我們的 StudentAppService 生成了WebApi,并且和Swagger完美兼容。

四.詳細(xì)介紹

經(jīng)過(guò)上面的介紹,大家應(yīng)該可以看出使用是非常簡(jiǎn)單的,只需兩步:

第一步:為你的類(lèi)(或者該類(lèi)的接口、該類(lèi)繼承的抽象類(lèi),不得放在該類(lèi)除前面兩種情況的父類(lèi)上)繼承 IDynamicWebApi接口并加入特性[DynamicWebApi]

第二步:Startup中注冊(cè)

// 添加動(dòng)態(tài)WebApi 需放在 AddMvc 之后
services.AddDynamicWebApi();

因?yàn)樾枰狹VC的一些類(lèi)來(lái)進(jìn)行處理,所以必須放在AddMvc之后,本組件有檢查。

1.規(guī)則

本組件采用約定大于配置,所以在實(shí)際使用中有幾個(gè)規(guī)則:

(1)要讓類(lèi)生成動(dòng)態(tài)API需要滿(mǎn)足兩個(gè)條件,一個(gè)是該類(lèi)直接或間接實(shí)現(xiàn) IDynamicWebApi,同時(shí)該類(lèi)本身或者父抽象類(lèi)或者實(shí)現(xiàn)的接口具有特性 DynamicWebApi

(2)添加特性 [NonDynamicWebApi] 可使一個(gè)類(lèi)或者一個(gè)方法不生成API,[NonDynamicWebApi] 具有最高的優(yōu)先級(jí)。

(3)會(huì)對(duì)符合規(guī)則的動(dòng)態(tài)API類(lèi)名進(jìn)行后綴的刪除,如:我們前面的 StudentAppService,會(huì)被刪除 AppService 后綴,這個(gè)規(guī)則是可以動(dòng)態(tài)配置的。

(4)會(huì)自動(dòng)添加API路由前綴,默認(rèn)會(huì)為所有API添加 api前綴

(5)默認(rèn)的HTTP動(dòng)詞為POST,可以通過(guò) HttpGet/HttpPost/HttpDelete 等等ASP.NET Core 內(nèi)置特性來(lái)覆蓋

(6)可以通過(guò)HttpGet/HttpPost/HttpDelete 等內(nèi)置特性來(lái)覆蓋默認(rèn)路由

(7)默認(rèn)會(huì)根據(jù)你的方法名字來(lái)設(shè)置HTTP動(dòng)詞,如 CreateApple 或者 Create 生成的API動(dòng)詞為 POST,對(duì)照表如下,若命中(忽略大小寫(xiě))對(duì)照表那么該API的名稱(chēng)中的這個(gè)動(dòng)詞將會(huì)被省略,如 CreateApple 將會(huì)變成 Apple,如未在以下對(duì)照表中,將會(huì)使用默認(rèn)動(dòng)詞 POST

方法名開(kāi)頭 動(dòng)詞
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)烈建議方法名稱(chēng)使用帕斯卡命名(PascalCase)規(guī)范,以更好的自動(dòng)處理API名稱(chēng),且使用以上對(duì)照表的動(dòng)詞。如:

添加蘋(píng)果 -> Add/AddApple/Create/CreateApple

更新蘋(píng)果 -> Update/UpdateApple

...

(9)[DynamicWebApi] 特性因?yàn)榭杀焕^承,所以為了父類(lèi)被誤識(shí)別,禁止放在除抽象類(lèi)、接口以外的父類(lèi)上。

2.配置

所有的配置均在對(duì)象 DynamicWebApiOptions 中,說(shuō)明如下:

屬性名 是否必須 說(shuō)明
DefaultHttpVerb 默認(rèn)值:POST。默認(rèn)HTTP動(dòng)詞
DefaultAreaName 默認(rèn)值:空。Area 路由名稱(chēng)
DefaultApiPrefix 默認(rèn)值:api。API路由前綴
RemoveControllerPostfixes 默認(rèn)值:AppService/ApplicationService。類(lèi)名需要移除的后綴
RemoveActionPostfixes 默認(rèn)值:Async。方法名需要移除的后綴
FormBodyBindingIgnoredTypes 默認(rèn)值:IFormFile。不通過(guò)MVC綁定到參數(shù)列表的類(lèi)型。

五.疑難解答

若遇到問(wèn)題,可使用 Issues 進(jìn)行提問(wèn)。

六.結(jié)束

本項(xiàng)目開(kāi)源地址:https://github.com/dotnetauth/Panda.DynamicWebApi 希望給個(gè) Star 支持一下

本文Demo地址:XiaoChen.StudentManagement

ABP:https://github.com/aspnetboilerplate/aspnetboilerplate

到此這篇關(guān)于ASP.NET Core奇淫技巧之動(dòng)態(tài)WebApi的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)ASP.NET Core 動(dòng)態(tài)WebApi內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

作者:曉晨Master

文章鏈接:https://www.cnblogs.com/stulzq/p/11007770.html

相關(guān)文章

最新評(píng)論