Furion框架亮點之-動態WebAPI


Furion框架亮點之-動態WebAPI

最近研究小僧的.Net5框架Furion,其中不乏讓人眼前一亮的新鮮玩意兒。於是想把一些亮點記錄並作分享。

相關地址

項目
文檔

動態WebAPI簡述(摘自文檔)

動態WebAPIFurion框架創造出一種更加靈活創建WebAPI控制器的方式,它對ASP.NET Core WebAPI進行了大量拓展和優化。
具有以下優點:

  • 具備原有的ControllerBase所有功能
  • 支持任意公開非靜態 非抽象 非泛型類轉控制器
  • 提供更加靈活方便的IDynamicApiController空接口或[DynamicApiController]特性替代ControllerBase抽象類
  • 無需手動配置[HttpMethod]特性,同時支持一個動作方法多個HttpVerb
  • 無需手動配置[Route]特性,支持更加靈活的配置及自動路由生成
  • 支持返回泛型接口,泛型類
  • Swagger深度結合,提供極其方便的創建Swagger分組配置
  • 支持Basic Auth Jwt ApiKey等多種權限靈活配置
  • 支持控制器、動作方法版本控制功能
  • 支持GETHEAD請求自動轉換 類類型參數
  • 支持生成OAS3接口規范

代碼與效果

先來看看代碼

public class PersonAppService : IDynamicApiController
{
    private readonly IRepository<Person> _personRepository;

    public PersonAppService(IRepository<Person> personRepository)
    {
        _personRepository = personRepository;
    }

    public Person Insert(Person person)
    {
        var entryEntity = _personRepository.InsertNow(person);
        return entryEntity.Entity;
    }

    public List<Person> GetAll(string keyword)
    {
        return _personRepository.Where(!string.IsNullOrEmpty(keyword), u => u.Name.Contains(keyword)).ToList();
    }
}

僅僅這樣,Swagger上已經能顯示接口

使用方法

創建一個類繼承IDynamicApiController接口 或 貼[DynamicApiController]特性即可。

動態WebAPI配置約定(摘自文檔)

控制器默認約定

  • 生成控制器名稱默認去除以 AppServices,AppService,ApiController,Controller,Services,Service 作為前后綴的字符串。見第一個例子中的 FurAppService -> Furion 支持自定義配置
  • 控制器名稱帶 V[0-9_] 結尾的,會自動生成控制器版本號,如 FurAppServiceV2 -> Furion@2,FurAppServiceV1_1_0 -> Furion@1.1.0。支持版本分隔符配置
  • 控制名稱以 駱駝命名(CamelCase) 會自動切割成多個單詞 - 連接。支持自定義配置

動作方法默認約定

  • 生成的動作方法名稱默認去除以 Post/Add/Create/Insert/Submit,GetAll/GetList/Get/Find/Fetch/Query/Search,Put/Update,Delete/Remove/Clear,Patch 開頭的字符串。支持自定義配置
  • 生成的動作方法名稱默認去除以 Async 作為前后綴的字符串。支持自定義配置
  • 動作方法名稱帶 V[0-9_] 結尾的,會自動生成動作方法版本號,如 ChangePasswordV2 -> ChangePassword@2,ChangePasswordV1_1_0 -> ChangePassword@1.1.0。支持版本分隔符配置
  • 動作方法名稱以 駱駝命名(CamelCase) 會自動切割成多個單詞 - 連接。支持自定義配置
  • 動作方法參數將自動轉為小寫。支持自定義配置

請求謂詞默認約定

  • 動作方法名
    以 Post/Add/Create/Insert/Submit 開頭,則添加 [HttpPost] 特性。
    以 GetAll/GetList/Get/Find/Fetch/Query 開頭,則添加 [HttpGet] 特性。
    以 Put/Update 開頭,則添加 [HttpPut] 特性。
    以 Delete/Remove/Clear 開頭,則添加 [HttpDelete] 特性。
    以 Patch 開頭,則添加 [HttpPatch] 特性
    支持自定義配置
  • 如果不在上面約定中,則默認添加 [HttpPost] 特性。支持自定義配置

路由地址默認約定

  • 默認以 api 開頭。支持自定義配置
  • 默認轉換為小寫路由地址。支持自定義配置
  • 生成控制器路由模板格式為:api/前置參數列表/模塊名或默認區域名/[controller@版本號]/后置參數列表
  • 生成動作方法路由模板格式為:前置參數列表/模塊名/[action@版本號]/后置參數列表

其他約定

  • 默認不處理 ControllerBase 控制器類型。支持自定義配置
  • 默認不處理 GET,HEAD 請求的引用類型參數。支持自定義配置

原理解析(摘自文檔)

控制器特性提供器

Furion 框架會在應用啟動時注冊 DynamicApiControllerFeatureProvider 控制器特性提供器,該提供器繼承自 ControllerFeatureProvider 類。
接着重寫 bool IsController(TypeInfo typeInfo) 方法,用來標識控制器類型。在 Furion 框架中,繼承自 ControllerBase 類或 IDynamicApiController 接口或 [DynamicApiController] 特性都會被標記為控制器類型。

應用模型轉換器

Furion 框架同時在應用啟動時注冊 DynamicApiControllerApplicationModelConvention 應用模型轉換器,該轉換器繼承自 IApplicationModelConvention 接口。
接着實現 void Apply(ApplicationModel application) 接口方法。在該方法中配置控制器名稱、路由、導出可見性及動作方法名稱、路由、導出可見性等。

其他

更多操作請查閱文檔
文檔-動態WebAPI

期待小僧和Furion能帶來更多驚喜!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM