欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

(5)默認(rèn)的HTTP動詞為POST,可以通過 HttpGet/HttpPost/HttpDelete 等等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ù)列表的類型。

五.疑難解答

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

六.結(jié)束

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

本文Demo地址:XiaoChen.StudentManagement

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

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

作者:曉晨Master

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

相關(guān)文章

最新評論