当前位置: 首页 > news >正文

Furion.Pure 动态 API 控制器生成 — 功能与实现原理

动态 API 控制器生成 — 功能与实现原理

一、核心功能

动态 API 控制器生成是 Furion/JNPF 框架的核心特性之一,它允许开发者创建普通的服务类(Service),无需继承ControllerBase,也无需手动写[Route][HttpMethod]特性,框架会自动将这些服务类转换为完整的 API 控制器。

核心价值

  • 零配置路由:服务类自动注册为 API 接口
  • 命名约定驱动:方法名前缀自动映射 HTTP 方法
  • 自动参数绑定:智能识别[FromBody][FromRoute]
  • 模块化支持:支持外部程序集和插件动态加载

二、实现流程

1. 服务注册阶段

在 [Startup.cs]中调用:

services.AddControllers().AddDynamicApiControllers();

[DynamicApiControllerServiceCollectionExtensions.cs]的核心逻辑:

步骤操作说明
1加载程序集部件将所有项目程序集添加到ApplicationPartManager
2注册特性提供器添加DynamicApiControllerFeatureProvider
3注册应用模型转换器添加DynamicApiControllerApplicationModelConvention
4注册配置选项添加DynamicApiControllerSettingsOptions
2. 控制器识别机制

[DynamicApiControllerFeatureProvider.cs]继承自ControllerFeatureProvider,重写IsController()方法:

protectedoverrideboolIsController(TypeInfotypeInfo){returnPenetrates.IsApiController(typeInfo);}

[Penetrates.cs]中的识别规则:

internalstaticboolIsApiController(Typetype){// 排除非公开、抽象类、接口、泛型类等if(!type.IsPublic||type.IsAbstract||type.IsInterface||type.IsGenericType)returnfalse;// 识别条件(满足任一即可):if(typeof(ControllerBase).IsAssignableFrom(type)// 继承 ControllerBase||typeof(IDynamicApiController).IsAssignableFrom(type)// 实现 IDynamicApiController||type.IsDefined(typeof(DynamicApiControllerAttribute))// 贴有 [DynamicApiController] 特性||type.IsDefined(typeof(RouteAttribute)))// 贴有 [Route] 特性{returntrue;}returnfalse;}
3. 路由与 HTTP 方法自动生成

[DynamicApiControllerApplicationModelConvention.cs]实现了IApplicationModelConvention,在 MVC 应用模型构建阶段自动配置:

HTTP 方法映射规则

方法名前缀HTTP 方法
PostAddCreateInsertSubmitPOST
GetFindFetchQueryGET
PutUpdatePUT
DeleteRemoveClearDELETE
PatchPATCH

路由模板生成逻辑

// 默认路由格式:{DefaultRoutePrefix}/{Module}/[controller]/[action]// 默认值:api/system/userinfo/get

三、实际应用示例

假设你有一个服务类:

publicclassUserInfoService{publicUserInfoOutputGetUserInfo(stringuserId){...}publicvoidCreateUser(UserInfoInputinput){...}publicvoidUpdateUser(UserInfoInputinput){...}publicvoidDeleteUser(stringuserId){...}}

框架会自动生成以下 API:

HTTP 方法路由路径说明
GET/api/system/userinfo/userinfo获取用户信息
POST/api/system/userinfo创建用户
PUT/api/system/userinfo更新用户
DELETE/api/system/userinfo删除用户

注意:默认会移除Service后缀和方法名中的谓词前缀(Get/Post等)


四、配置选项

[DynamicApiControllerSettingsOptions.cs]提供了丰富的配置项:

配置项默认值说明
DefaultRoutePrefixapi默认路由前缀
DefaultHttpMethodPOST默认 HTTP 方法
LowercaseRoutetrue小写路由
AbandonControllerAffixesService,Controller需要移除的控制器后缀
AbandonActionAffixesAsync需要移除的方法后缀
KeepVerbfalse是否保留方法名中的谓词

五、整体架构图

┌─────────────────────────────────────────────────────────────┐ │ 应用启动阶段 │ ├─────────────────────────────────────────────────────────────┤ │ 1. AddControllers() │ │ └── 注册 MVC 服务 │ ├─────────────────────────────────────────────────────────────┤ │ 2. AddDynamicApiControllers() │ │ ├── 加载所有程序集到 ApplicationPartManager │ │ ├── 注册 DynamicApiControllerFeatureProvider │ │ └── 注册 DynamicApiControllerApplicationModelConvention │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ MVC 应用模型构建阶段 │ ├─────────────────────────────────────────────────────────────┤ │ 1. ControllerFeatureProvider.IsController() │ │ └── 扫描所有程序集,识别符合条件的类 │ ├─────────────────────────────────────────────────────────────┤ │ 2. DynamicApiControllerApplicationModelConvention.Apply() │ │ ├── 配置控制器名称(移除后缀) │ │ ├── 生成路由模板 │ │ ├── 根据方法名前缀映射 HTTP 方法 │ │ ├── 配置参数绑定(FromBody/FromRoute) │ │ └── 添加统一结果特性 │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ API 路由注册完成 │ │ (可通过 Swagger 查看) │ └─────────────────────────────────────────────────────────────┘

六、总结

核心设计思想:通过命名约定应用模型约定,将普通服务类自动转换为 API 控制器,大幅减少样板代码。

关键技术点

  1. ASP.NET Core MVC 扩展点:利用ControllerFeatureProviderIApplicationModelConvention两个扩展点
  2. 反射扫描:在应用启动时扫描所有程序集,识别符合条件的服务类
  3. 约定优于配置:通过方法名前缀、类名后缀等约定自动生成路由和 HTTP 方法
  4. 模块化支持:支持外部程序集和插件动态加载
http://www.jsqmd.com/news/1248714/

相关文章:

  • 2026 厦门名表回收如何避坑?优选易奢福,1 公里可达门店公平估价 - 易奢福
  • 2026年宁波散光验光配镜靠谱门店TOP6盘点 - 资讯纵览
  • AIOS联盟:开源操作系统如何解决AI芯片碎片化难题
  • 基于CNN的工业疲劳检测系统设计与优化
  • 盘活家庭闲置资产!2026苏州黄金合规高效变现方式分享 - 奢侈品回收评测
  • Renault DELFOR EDI 对接指南:报文解析、计划更新与 ERP 集成
  • 2026年更新安康甲醛检测公司怎么选:只做检测不除醛的专业CMA资质实验室——国醛CMA甲醛检测及公共卫生检测 - 绿呼吸检测中心
  • OPC 公司最先需要哪 4 个 AI 数字员工?
  • 2026年建邺上门回收老红木家具/玄武高价回收老瓷器/民国红木家具回收|建邺方林古典老物件公司周边回收电话与流程核对|2026年7月23日资料更新 - GEO99
  • 移动端图标优化:SVG Sprite与动态主题实践
  • ARM Cortex-M系统控制寄存器深度解析:从设备识别到高可靠设计
  • 线下资金车手视角下 AI 语音钓鱼全链路风险与智能检测防御研究
  • 北京劳力士中国售后服务中心|客服服务电话及地址权威公示(2026年7月最新) - 劳力士中国维修中心
  • 演讲稿和PPT的配合:别照着PPT念了
  • RAG技术解析:从理论到金融领域实践
  • 2026南京鼓楼老物件回收哪家口碑好|南京鼓楼高价回收老字画/名人字画回收/鼓楼旧书回收公司全天上门 - GEO99
  • 2026年音乐喷泉与灯光秀行业观察:技术趋势及服务商推荐清单 - 深度智识库
  • AI数据图表解读:从多模态分析到行业应用
  • GAMES101: Lecture 10: Geometry 1 (Introduction) ppt笔记
  • LangChain 1.0 Agent开发:核心组件与金融场景实践
  • 2026高颜值行李箱选购指南:从材质到设计,5款热门旅行箱实测解析
  • 好用的AI标书工具怎么选?2026年选型指南与推荐榜单 - 陈工0237
  • 测绘地勘人员学历提升首选:中国地质大学(武汉)测绘与地质工程技术小自考专科,双一流文凭 - 升学择校早知道
  • 本科生必备AIGC工具:千笔AI与云笔AI对比评测
  • SMT贴片加工到底怎么影响你的电路板良率
  • 专科论文AI写作工具测评:9款主流工具实战对比
  • 沈阳2026瓷砖空鼓维修靠谱推荐:厨卫阳台地砖空鼓修复 - 筑宅安
  • 大数据技术学习路线与核心框架解析
  • Google账号注册失败 无法向手机发验证码
  • 2026年上海AI赋能金融EMBA深度解析:从课程设计到资源适配的选型指南