尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

Furion.Pure 动态 API 控制器生成 — 功能与实现原理
📅 发布时间:2026/7/23 16:13:11

动态 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 方法
Post、Add、Create、Insert、SubmitPOST
Get、Find、Fetch、QueryGET
Put、UpdatePUT
Delete、Remove、ClearDELETE
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 扩展点:利用ControllerFeatureProvider和IApplicationModelConvention两个扩展点
  2. 反射扫描:在应用启动时扫描所有程序集,识别符合条件的服务类
  3. 约定优于配置:通过方法名前缀、类名后缀等约定自动生成路由和 HTTP 方法
  4. 模块化支持:支持外部程序集和插件动态加载

相关新闻

  • 基于CNN的工业疲劳检测系统设计与优化
  • AIOS联盟:开源操作系统如何解决AI芯片碎片化难题
  • 北京劳力士中国售后服务中心|客服服务电话及地址权威公示(2026年7月最新) - 劳力士中国维修中心

最新新闻

  • 实测 Doubao-Seed-Evolving:把 Windows 桌面图标做成一个会自己运转的小世界
  • Codex + cc-switch + GPT-5.5 国内免魔法使用教程:从注册 API 到接入 Windows/macOS 桌面版,小白也能看懂
  • SwiftUI:iOS 常用视图组件速查
  • 数字同事:RPA+AI如何提升团队生产力
  • Java面试八股文1000问(2026金九银十版),涵盖基础/网络/算法/设计模式/多线程
  • 静态原生IP代理配置指南:从原理到VMLogin实战应用

日新闻

  • 亨得利盐城维修点在哪里?手表维修保养地址指南**公示(2026年7月最新) - 亨得利官方
  • 提升.NET API安全性:Boxed.AspNetCore.Swagger认证授权最佳实践
  • 帝舵佛山**网点地址更新:2026年7月售后热线电话与服务客户指南 - 帝舵中国官方服务中心

周新闻

  • SaaS软件行业GEO实践:AI搜索时代的品牌可见性与获客新路径
  • 什么是PCTFE?医药高端包装的“防潮王牌“材料
  • 【JVM调优实战】16-可视化利器-JConsole-VisualVM-JMC

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号