ABP vNext 框架功能模块 - 动态API(Dynamic API)[RemoteServiceAttribute | DynamicApiControllerBuilder]

news/2025/10/24 20:28:16/文章来源:https://www.cnblogs.com/tangge/p/19164175

动态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.mzph.cn/news/945642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第4天(中等题 滑动窗口、哈希表)

打卡第四天 两道中等题哈希表记录元素频率:哈希表程序表示:滑动窗口+哈希表优化算法耗时≈一小时 明天继续 小tips:不小心删除可以用 Ctrl+Z 撤回刚刚消除的代码/文字

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

** 动态API(Dynamic API)** 核心辅助类:DynamicApiControllerBuilder:动态生成API控制器。 RemoteServiceAttribute:标记类/方法为远程服务(自动暴露API)。在ABP框架中,DynamicApiControllerBuilder和RemoteSe…

ABP vNext 框架功能模块 - 模块化(Modularity)

模块化(Modularity) 核心辅助类:AbpModule:所有模块的基类,定义模块生命周期方法。 DependsOnAttribute:声明模块依赖关系。 ModuleInitializer:模块初始化器(自动生成)。 IModuleContainer:模块容器,用于运…

ABP vNext 框架功能模块

以下是ABP框架中各核心功能的辅助类及示例说明,涵盖模块化、依赖注入、ORM集成等关键特性: 一. 模块化(Modularity) 核心辅助类:AbpModule:所有模块的基类,定义模块生命周期方法。 DependsOnAttribute:声明模块…

题解:P14299 [JOI2023 预选赛 R2] 填充 / Painting

\(\displaystyle \large {题目传送门}\) 题面 给定一个一个 H*W 的矩形 , 每个坐标上有一个颜色 , 上下左右相邻的同颜色节点可以形成连通块 。 你可以对任意一个连通块 , 进行一次并仅有一次的染色 , 求新形成的连…

Devolutions Server权限提升漏洞分析与修复指南

本文详细分析了CVE-2025-11957漏洞,该漏洞存在于Devolutions Server 2025.2.12.0及更早版本中,由于临时访问工作流程的授权机制存在缺陷,允许经过身份验证的基本用户通过精心构造的API请求自我批准或批准其他用户的…

AI股票预测分析报告 - 2025年10月24日 - 20:08:50

AI股票预测分析报告 - 2025年10月24日body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-width: 1…

在 Astro 博客中优雅使用 51.la 统计数据

在 Astro 博客中使用 51.la 免费流量统计,通过解析 widget JS 自行渲染访问数据,既保留统计功能,又可自定义展示,让你直观了解博客访客情况作为老牌网站流量统计服务商,51.la 提供每月高达 1000 万次的免费统计额…

申威服务器安装Java11(swjdk-11u-9.ky10.sw_64.rpm)详细操作步骤(附安装包)

申威服务器安装Java11(swjdk-11u-9.ky10.sw_64.rpm)详细操作步骤(附安装包)​这是申威架构(国产芯片,常见于Kylin V10等国产系统)专用的 ​Java 11 版本(RPM安装包)​,包名为 java-11.0.7-swjdk-11u-9.ky10.…

str.endswith() 类似的方法

在Python中,与str.endswith()类似的方法(主要涉及字符串的开头/结尾检查、子串搜索等)有很多,以下是核心方法及其功能对比: 1. 开头检查:str.startswith()功能:检查字符串是否以指定前缀开头,返回True/False。…

深度剖析OpenHarmony AI Engine:开发板端侧大模型推理插件机制全链路拆解 - 实践

深度剖析OpenHarmony AI Engine:开发板端侧大模型推理插件机制全链路拆解 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

Linux下的拼音输入法 (3)

此贴简介libgooglepinyin-0.1.2,刚看了几分钟(持续更新中): data/下: 730 2012年 2月 3日 CMakeLists.txt227 2012年 2月 3日 googlepinyin.pc.in3.5M 2012年 2月 3日 rawdict_utf16_65105_freq.be.txt3.5M 2012年…

P2606 [ZJOI2010] 排列计数 分析

题目概述 题目链接:https://www.luogu.com.cn/problem/P2606。 称一个 \(1 \sim n\) 的排列 \(p_1,p_2, \dots ,p_n\) 是 Magic 的,当且仅当 \[\forall i \in [2,n],p_i > p_{\lfloor i/2 \rfloor} \]计算 \(1 \s…

实用指南:MacOS - Clang使用bits/stdc++.h - 非官方(竞赛用) - 通用方法

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

cgroup

cgroupcgroup v1使用流程: mount -t tmpfs cgroup_root /sys/fs/cgroup mkdir -p /sys/fs/cgroup/cpu mkdir -p /sys/fs/cgroup/memory mount -t cgroup -o cpu none /sys/fs/cgroup/cpu mount -t cgroup -o memory n…

设计模式:代码界的 “光之巨人” 养成指南(附 C++ 实战)

参考 https://bbs.huaweicloud.com/blogs/397606 https://refactoring.guru/design-patterns/catalog 一、概述 1.1、什么是设计模式 官方定义说得有点绕:“一套被反复使用、多数人知晓、分类编目的代码设计经验总结”…

详细介绍:17-Language Modeling with Gated Convolutional Networks

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

数字人:数字人公司排行榜及技术深度剖析

数字人企业:探索虚拟与现实的融合新纪元 数字人企业的创新之路与市场机遇解析 数字人企业排行榜及技术深度剖析 正文: 在当今科技飞速发展的时代,数字人企业正成为推动数字化转型的重要力量。它们不仅重塑了人机交互…

【同余最短路】学习笔记

例题 \(1\):P3403 跳楼机:给定正整数 \(h,x,y,z\),求有多少 \(d\in[1,h]\) 满足 \(ax+by+cz=d-1\),其中 \(a,b,c\) 为非负整数。这道题第一眼给我的印象是一道数论题,但仔细想了想发现做不了。注意到 \(x,y,z\) 的…