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

ABP vNext 框架功能模块 - 动态API(Dynamic API)

** 动态API(Dynamic API)**

核心辅助类

  • DynamicApiControllerBuilder:动态生成API控制器。
  • RemoteServiceAttribute:标记类/方法为远程服务(自动暴露API)。

在ABP框架中,DynamicApiControllerBuilderRemoteServiceAttribute是实现动态API的核心工具,它们能自动将应用服务(Application Service)暴露为HTTP API接口,无需手动编写控制器代码,极大简化了API开发流程。以下是具体示例和讲解:

1. RemoteServiceAttribute:标记服务为远程服务(自动暴露API)

RemoteServiceAttribute用于标记类或方法为“远程服务”,ABP框架会自动识别这些标记,将其作为API接口暴露给客户端。它可以控制是否暴露服务、定义API前缀等。

示例:标记应用服务为远程服务

using Volo.Abp.Application.Services;
using Volo.Abp.RemoteServices;// 标记整个服务为远程服务(默认暴露所有公共方法)
[RemoteService(Name = "BookStore")] // 可选:指定API名称(影响路由)
public class BookAppService : ApplicationService, IBookAppService
{// 方法会自动暴露为API:GET /api/book-store/book/{id}public async Task<BookDto> GetAsync(Guid id){// 业务逻辑:查询书籍}// 标记此方法不暴露为API[RemoteService(IsEnabled = false)]public async Task InternalMethodAsync(){// 内部方法,不对外提供API}// 自定义HTTP方法和路由(默认按方法名推断,如Create->POST)[HttpPost("custom-create")] // 覆盖默认路由:POST /api/book-store/book/custom-createpublic async Task<BookDto> CreateWithSpecialLogicAsync(CreateBookDto input){// 业务逻辑:创建书籍}
}

讲解:

  • 类级别标记[RemoteService] 加在服务类上,表明该服务的公共方法默认会被暴露为API。Name属性可指定API的前缀(如示例中的BookStore,默认路由会包含该名称)。
  • 方法级别标记[RemoteService(IsEnabled = false)] 可单独禁用某个方法的API暴露,适用于内部调用的方法。
  • 与HTTP特性结合:可通过[HttpGet][HttpPost]等特性自定义HTTP方法和路由,覆盖ABP的默认推断(默认规则:Get->GETCreate->POSTUpdate->PUTDelete->DELETE)。

2. DynamicApiControllerBuilder:手动配置动态API生成

DynamicApiControllerBuilder用于手动配置动态API的生成规则,通常在模块的ConfigureServices方法中使用。它可以批量处理程序集内的服务,自定义API路由、命名空间等。

示例:批量配置程序集中的服务为动态API

using Volo.Abp.Application.Services;
using Volo.Abp.Http.Configuration;public class MyAppModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){// 批量处理指定程序集中的所有应用服务DynamicApiControllerBuilder.ForAssembly(typeof(MyAppModule).Assembly) // 扫描当前模块所在程序集.AddControllers(options =>{// 自定义API前缀(默认是"api")options.RootPath = "api/v2"; // 过滤需要暴露的服务(仅包含实现了IApplicationService的类)options.TypePredicate = type => typeof(IApplicationService).IsAssignableFrom(type);});// 单独配置某个服务(更精细的控制)DynamicApiControllerBuilder.For<IBookAppService>("book-store/custom-books") // 指定API路由前缀:/api/book-store/custom-books.Build(); // 生成控制器}
}

讲解:

  • 批量配置ForAssembly方法扫描整个程序集,自动将实现了IApplicationService(应用服务接口)的类暴露为API。AddControllers中的选项可全局设置路由前缀(如api/v2)、过滤服务类型等。
  • 单独配置For<TService>方法针对单个服务接口进行配置,通过参数指定路由前缀(如book-store/custom-books),生成的API路由会变为/api/book-store/custom-books/[方法名]
  • 默认路由规则:若不手动指定,ABP会按“服务名称+方法名”生成路由。例如BookAppServiceGetAsync方法,默认路由为/api/app/book/getapp是默认前缀,book是服务名缩写)。

3. 动态API的核心优势

  1. 零控制器代码:无需手动编写Controller类,框架自动生成,减少重复工作。
  2. 自动路由生成:按服务名和方法名自动推断路由,也支持自定义。
  3. 与依赖注入集成:动态生成的控制器会自动注入应用服务,无需手动处理依赖。
  4. Swagger自动集成:生成的API会自动显示在Swagger文档中,便于调试。

4. 总结

  • RemoteServiceAttribute是“标记型”配置,通过特性快速指定服务或方法是否暴露为API,适合简单场景。
  • DynamicApiControllerBuilder是“编程式”配置,适合批量处理或需要自定义路由、前缀的复杂场景。

两者结合使用,可高效实现API的自动生成,让开发者专注于业务逻辑而非API配置。

http://www.hskmm.com/?act=detail&tid=38361

相关文章:

  • ABP vNext 框架功能模块 - 模块化(Modularity)
  • Devolutions Server权限提升漏洞分析与修复指南
  • AI股票预测分析报告 - 2025年10月24日 - 20:08:50
  • 题解:P14299 [JOI2023 预选赛 R2] 填充 / Painting
  • str.endswith() 类似的方法
  • 在 Astro 博客中优雅使用 51.la 统计数据
  • 2025.10.24博客
  • cgroup
  • 设计模式:代码界的 “光之巨人” 养成指南(附 C++ 实战)
  • 深度剖析OpenHarmony AI Engine:开发板端侧大模型推理插件机制全链路拆解 - 实践
  • Linux下的拼音输入法 (3)
  • P2606 [ZJOI2010] 排列计数 分析
  • 分治算法乱讲
  • 电动三轮车后桥改造添加动能回收实现无限续航的可能。
  • Claude Code配置记录
  • 视频融合平台EasyCVR在智慧工地中的应用:构建安全、智能、高效的“云上工地” - 实践
  • 股票操作统计分析报告 - 2025年10月24日
  • [HZOI] CSP-S模拟37 赛后总结
  • 24
  • 数字人:数字人公司排行榜及技术深度剖析
  • 【同余最短路】学习笔记
  • 数字人:数字人公司深度解析与未来展望
  • CSP/NOIP 复习:单调栈
  • 算法分析--生成排列
  • 三大安全认证授权协议深度对比:OAuth、OpenID Connect与SAML
  • 数字人公司:数字人新趋势技术驱动与市场前景解析
  • AI股票预测分析报告 - 2025年10月24日
  • 数据绑定相关概念理解
  • 数字人企业:数字人公司排行榜Top 3解析
  • (简记)(自用)线段树区间拆分时间复杂度证明