Furion框架亮點之-動態WebAPI
最近研究小僧的.Net5框架Furion,其中不乏讓人眼前一亮的新鮮玩意兒。於是想把一些亮點記錄並作分享。
相關地址
動態WebAPI簡述(摘自文檔)
動態WebAPI是Furion框架創造出一種更加靈活創建WebAPI控制器的方式,它對ASP.NET Core WebAPI進行了大量拓展和優化。
具有以下優點:
- 具備原有的ControllerBase所有功能
- 支持任意公開非靜態 非抽象 非泛型類轉控制器
- 提供更加靈活方便的IDynamicApiController空接口或[DynamicApiController]特性替代ControllerBase抽象類
- 無需手動配置[HttpMethod]特性,同時支持一個動作方法多個HttpVerb
- 無需手動配置[Route]特性,支持更加靈活的配置及自動路由生成
- 支持返回泛型接口,泛型類
- 和Swagger深度結合,提供極其方便的創建Swagger分組配置
- 支持Basic Auth Jwt ApiKey等多種權限靈活配置
- 支持控制器、動作方法版本控制功能
- 支持GET、HEAD請求自動轉換 類類型參數
- 支持生成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能帶來更多驚喜!