ABP框架如何移除Swagger中显示的应用层API
问题描述
使用ABP框架创建项目后,运行Swagger时发现应用层的方法被识别为API并展示出来,希望移除这些内容。
应用层代码
public class UserService : AdminSSOAppService, ITransientDependency, IValidationEnabled, IUserService { IUserRepository _userRepository; private readonly ILogger<UserService> _log; public UserService(IUserRepository userRepository, ILogger<UserService> log ) { _userRepository = userRepository; _log = log; } public async Task<List<UserDto>> GetList() { var list = await _userRepository.GetListAsync(); return ObjectMapper.Map<List<User>, List<UserDto>>(list); } public async Task<UserDto> GetUserById(int Id) { var user = await _userRepository.GetAsync(c=>c.Id == Id); return ObjectMapper.Map<User, UserDto>(user); } }
HttpApi层代码
[Area(AdminSSORemoteServiceConsts.ModuleName)] [RemoteService(Name = AdminSSORemoteServiceConsts.RemoteServiceName)] [Route("api/user/user-profile")] public class UserController : ControllerBase, IUserService { private readonly IUserService _userAppService; public UserController(IUserService userAppService) { _userAppService = userAppService; } [HttpGet] [Route("get-list-httpapi")] public Task<List<UserDto>> GetList() { return _userAppService.GetList(); } [HttpGet] [Route("get-by-id-httpapi")] public Task<UserDto> GetUserById(int Id) { return _userAppService.GetUserById(Id); } }
解决方案
问题根源是ABP默认会将实现IRemoteService的服务(包括应用层服务)注册为远程服务,进而被Swagger扫描到。以下是几种解决方式:
方法1:给应用层服务添加[RemoteService(false)]特性
直接在应用层服务类或其接口上添加该特性,标记其不作为远程服务暴露:
// 在UserService类上添加 [RemoteService(false)] public class UserService : AdminSSOAppService, ITransientDependency, IValidationEnabled, IUserService { // 原有代码不变 }
或者在接口上添加:
[RemoteService(false)] public interface IUserService { Task<List<UserDto>> GetList(); Task<UserDto> GetUserById(int Id); }
方法2:在模块配置中排除应用层程序集
在HttpApi模块类(如AdminSSOHttpApiModule)的ConfigureServices方法中,配置AbpApiExplorerOptions只包含HttpApi层程序集:
public override void ConfigureServices(ServiceConfigurationContext context) { // 其他配置代码... Configure<AbpApiExplorerOptions>(options => { // 移除应用层程序集,避免被Swagger扫描 options.Assemblies.Remove(typeof(UserService).Assembly); // 确保只包含HttpApi层的控制器程序集 options.Assemblies.Add(typeof(UserController).Assembly); }); }
方法3:配置Swagger仅扫描HttpApi层程序集
在Swagger配置中,通过DocInclusionPredicate过滤非HttpApi层的API:
services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new OpenApiInfo { Title = "AdminSSO API", Version = "v1" }); // 加载HttpApi层的XML注释(可选) options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "YourProject.HttpApi.xml")); // 仅包含HttpApi层控制器的API options.DocInclusionPredicate((docName, apiDesc) => { var controllerAssembly = apiDesc.ActionDescriptor.RouteValues["controller"]? .GetType().Assembly.GetName().Name; return controllerAssembly == "YourProject.HttpApi"; }); });
补充说明
优先推荐方法1,操作简单且针对性强;如果有大量应用层服务需要处理,可选择方法2或3批量配置。
内容的提问来源于stack exchange,提问作者Nguyen Duy Anh
相关产品推荐
相关产品推荐

