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加载程序集部件将所有项目程序集添加到ApplicationPartManager2注册特性提供器添加DynamicApiControllerFeatureProvider3注册应用模型转换器添加DynamicApiControllerApplicationModelConvention4注册配置选项添加DynamicApiControllerSettingsOptions2. 控制器识别机制[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、SubmitPOSTGet、Find、Fetch、QueryGETPut、UpdatePUTDelete、Remove、ClearDELETEPatchPATCH路由模板生成逻辑// 默认路由格式{DefaultRoutePrefix}/{Module}/[controller]/[action]// 默认值api/system/userinfo/get三、实际应用示例假设你有一个服务类publicclassUserInfoService{publicUserInfoOutputGetUserInfo(stringuserId){...}publicvoidCreateUser(UserInfoInputinput){...}publicvoidUpdateUser(UserInfoInputinput){...}publicvoidDeleteUser(stringuserId){...}}框架会自动生成以下 APIHTTP 方法路由路径说明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 控制器大幅减少样板代码。关键技术点ASP.NET Core MVC 扩展点利用ControllerFeatureProvider和IApplicationModelConvention两个扩展点反射扫描在应用启动时扫描所有程序集识别符合条件的服务类约定优于配置通过方法名前缀、类名后缀等约定自动生成路由和 HTTP 方法模块化支持支持外部程序集和插件动态加载

相关新闻

深圳成人学历教育机构精选清单:9家靠谱机构深度对比

深圳成人学历教育机构精选清单:9家靠谱机构深度对比

导语 在深圳打拼的在职人员,想要通过成人学历教育提升竞争力、满足积分落户需求或考取职业资格证书,面对市场上众多的教育培训机构,往往不知如何选择。成人学历教育不同于其他消费型服务,涉及到学习周期、费用投入和最终的学历认可…

2026/10/18 3:44:39 阅读更多 →
计算机毕业设计之基于MVC架构科技资讯网站

计算机毕业设计之基于MVC架构科技资讯网站

随着当今社会的发展,时代的进步,各行各业也在发生着变化,互联网已经逐步进入人们的生活。传统的科技资讯,都是通过报纸、杂志等等方式进行了解资讯,这种传统方式局限性比较大且花费较多。网络以及计算机为解决当前的问…

2026/10/18 8:35:04 阅读更多 →
AI如何通过模块化写作与智能文献引擎提升学术效率

AI如何通过模块化写作与智能文献引擎提升学术效率

1. 项目概述:AI如何重塑学术写作体验在高校图书馆通宵赶论文的夜晚,每个学生都幻想过能有个"写作外挂"。去年我在指导本科生论文时发现,90%的学生在文献综述环节就耗费了超过50%的时间,而格式调整这类机械工作又吞噬了剩…

2026/10/17 14:35:36 阅读更多 →

最新新闻

Agent认知闭环:记忆、反思与Skill的动态协同设计

Agent认知闭环:记忆、反思与Skill的动态协同设计

1. 这不是“加功能”,而是重构Agent的认知闭环“给 Agent 加了记忆、反思、Skill,真的会变强吗?”——这个标题乍看像一句技术调侃,实则直击当前智能体(Agent)开发中最常被轻率对待的核心命题。我见过太多团…

2026/10/18 10:12:40 阅读更多 →
Git进阶实战:分支管理、合并策略与历史救援

Git进阶实战:分支管理、合并策略与历史救援

假设你已经会了git add、git commit、git push这条最基础的操作链路,仓库能建了,代码也能推上去了。可一旦进入真实的项目开发,你会发现 Git 远远不是背几条命令这么简单:分支一多就分不清谁是谁,合并时满屏冲突不知道…

2026/10/18 10:12:40 阅读更多 →
Dify Docker 连接宿主机 MCP 服务 403 排障指南:用 TaoToken 统一 Key 打通调用链

Dify Docker 连接宿主机 MCP 服务 403 排障指南:用 TaoToken 统一 Key 打通调用链

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 10:12:40 阅读更多 →
HTML+CSS第二次作业实战:从拆需求到提交自查全攻略

HTML+CSS第二次作业实战:从拆需求到提交自查全攻略

第二次HTMLCSS作业,往往是前端入门路上第一道正式的坎。第一次作业可能只是写几个标签、改两段样式,到了第二次,通常就要完整做一个静态页面了——导航栏、图文列表、表单、页脚……要求一下子多了不少。今天这篇就跟你说说,面对这…

2026/10/18 10:12:40 阅读更多 →
Vue前端小例子实战:列表渲染、表单绑定与组件通信核心机制解析

Vue前端小例子实战:列表渲染、表单绑定与组件通信核心机制解析

简介:这是一份面向Vue.js初学者与前端进阶者的实战型小例子资源,围绕一个资产管理应用展开,帮助读者在动手实践中理解Vue的核心概念与工程化配置。内容涵盖Vue实例与数据绑定、计算属性与侦听器、组件化拆分、模板语法中的条件与循环渲染&…

2026/10/18 10:12:40 阅读更多 →
基于LSTM的蔬菜价格预测:从数据清洗到模型训练的完整指南

基于LSTM的蔬菜价格预测:从数据清洗到模型训练的完整指南

简介:基于深度学习LSTM实现蔬菜价格预测的完整项目资源包,面向Python学习者、数据挖掘爱好者,以及需要进行课程设计、毕业设计或实战项目的人员,覆盖从网页数据采集、数据清洗、时间序列建模到Web与微信公众号结果展示的完整流程。…

2026/10/18 10:11:40 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →