<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ASP.NET Core 奇淫技巧之動(dòng)態(tài)WebApi

          共 5412字,需瀏覽 11分鐘

           ·

          2022-04-13 03:07

          出處:https://www.cnblogs.com/stulzq/p/11007770.html

          作者:曉晨Master(李志強(qiáng))

          一.前言

          接觸到動(dòng)態(tài)WebApi(Dynamic Web API)這個(gè)詞的已有幾年,是從ABP框架里面接觸到的,當(dāng)時(shí)便對(duì)ABP的這個(gè)技術(shù)很好奇,后面分析了一波,也嘗試過從ABP剝離一個(gè)出來作為獨(dú)立組件來使用,可是后來因與ABP依賴太多而放棄。十幾天前朋友?熊貓?將這部分代碼(我和他在搞事情)成功的從 ABP 中剝離出來并做了一個(gè)簡(jiǎn)單Demo扔給我,經(jīng)過這么久(實(shí)在是太懶_)終于經(jīng)過一些修改、添加功能、封裝,現(xiàn)在已經(jīng)能作為一個(gè)獨(dú)立組件使用,項(xiàng)目開源在Github(https://github.com/dotnetauth/Panda.DynamicWebApi),希望覺得有用的朋友能給一個(gè) 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)用,這里我們可能會(huì)有一個(gè)重復(fù)的操作:編寫業(yè)務(wù)邏輯->編寫API調(diào)用業(yè)務(wù)邏輯,這種重復(fù)性的操作有沒有解決辦法呢,我們編寫完業(yè)務(wù)邏輯以后便給我們自動(dòng)生成WebApi,答案當(dāng)然是有的。

          這里介紹一下本文的主角:Panda.DynamicWebApi(https://github.com/dotnetauth/Panda.DynamicWebApi)。源自于ABP的一個(gè)可獨(dú)立使用的,可自動(dòng)為你的業(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)建立兩個(gè)項(xiàng)目一個(gè)是應(yīng)用邏輯層類庫項(xiàng)目;一個(gè)是作為生成WebApi Host,ASP.NET Core WebApi項(xiàng)目

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

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

          public interface IApplicationService
          {
          }

          定義一個(gè)學(xué)生管理邏輯接口,繼承應(yīng)用邏輯接口

          public interface IStudentAppService : IApplicationService{    ///     /// 根據(jù)ID獲取學(xué)生    ///     ///     ///     StudentOutput Get(int id);
          /// /// 獲取所有學(xué)生 /// /// List Get();
          /// /// 更新學(xué)生信息 /// /// void Update(UpdateStudentInput input);
          /// /// 更新學(xué)生年齡 /// /// void UpdateAge(int age);
          /// /// 根據(jù)ID刪除學(xué)生 /// /// void Delete(int id);
          /// /// 添加學(xué)生 /// /// void Create(CreateStudentInput input);}

          實(shí)現(xiàn)學(xué)生邏輯管理接口:

          public class StudentAppService: IStudentAppService{    ///     /// 根據(jù)ID獲取學(xué)生    ///     ///     ///     [HttpGet("{id:int}")]    public StudentOutput Get(int id)    {        return new StudentOutput() {Id = 1, Age = 18, Name = "張三"};    }
          /// /// 獲取所有學(xué)生 /// /// public List Get() { return new List() { new StudentOutput(){Id = 1,Age = 18,Name = "張三"}, new StudentOutput(){Id = 2,Age = 19,Name = "李四"} }; }
          /// /// 更新學(xué)生信息 /// /// public void Update(UpdateStudentInput input) { throw new System.NotImplementedException(); }
          /// /// 更新學(xué)生年齡 /// /// [HttpPatch("{id:int}/age")] public void UpdateAge(int age) { throw new System.NotImplementedException(); }
          /// /// 根據(jù)ID刪除學(xué)生 /// /// [HttpDelete("{id:int}")] public void Delete(int id) { throw new System.NotImplementedException(); }
          /// /// 添加學(xué)生 /// /// 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

          通過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();

          然后打開瀏覽器訪問將會(huì)看到:

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

          四.詳細(xì)介紹

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

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

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

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

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

          1.規(guī)則

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

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

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

          (3)會(huì)對(duì)符合規(guī)則的動(dòng)態(tài)API類名進(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,可以通過?HttpGet/HttpPost/HttpDelete等等ASP.NET Core 內(nèi)置特性來覆蓋

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

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

          方法名開頭動(dòng)詞
          createPOST
          addPOST
          postPOST
          getGET
          findGET
          fetchGET
          queryGET
          updatePUT
          putPUT
          deleteDELETE
          removeDELETE

          (8)強(qiáng)烈建議方法名稱使用帕斯卡命名(PascalCase)規(guī)范,以更好的自動(dòng)處理API名稱,且使用以上對(duì)照表的動(dòng)詞。如:

          添加蘋果 -> Add/AddApple/Create/CreateApple

          更新蘋果 -> Update/UpdateApple

          ...

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

          2.配置

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

          屬性名是否必須說明
          DefaultHttpVerb默認(rèn)值:POST。默認(rèn)HTTP動(dòng)詞
          DefaultAreaName默認(rèn)值:空。Area 路由名稱
          DefaultApiPrefix默認(rèn)值:api。API路由前綴
          FormBodyBindingIgnoredTypes默認(rèn)值:IFormFile。不通過MVC綁定到參數(shù)列表的類型。

          五.疑難解答

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

          六.結(jié)束

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

          本文Demo地址:XiaoChen.StudentManagement

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

          瀏覽 34
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色在线视频免费观看 | 亚洲第一视频网站 | 91成人免费 | 国产又黄又粗视频 | 手机在线免费看黄色电影一级片 |