You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ABP CrudAppService/AsyncCrudAppService中自定义路由?

在ABP框架中为CrudAppService批量修改API端点路径(类级别配置)

当然可以在类级别统一配置路由前缀,无需逐个方法修改,以下是几种实用方案:

1. 直接给AppService类添加[Route]特性

在你的MyFooAppService类上添加[Route]特性,指定统一的前缀路径,CrudAppService内置的所有方法(Get/GetAll/Create/Update/Delete)都会自动继承这个前缀:

[Route("api/services/app/baz/MyFoo")]
public class MyFooAppService : BaseAsyncCrudAppService<MyFooEntity, MyFooDto>,
    IMyFooAppService
{
    public MyFooAppService(IRepository<MyFooEntity, Guid> repository) : base(repository)
    {
    }
}

配置后生成的端点会自动变为:

GET /api/services/app/baz/MyFoo/Get
GET /api/services/app/baz/MyFoo/GetAll
POST /api/services/app/baz/MyFoo/Create
PUT /api/services/app/baz/MyFoo/Update
DELETE /api/services/app/baz/MyFoo/Delete

2. 在基类中配置通用路由(批量复用)

如果多个AppService需要统一添加相同前缀(比如都加baz),可以直接在你的BaseAsyncCrudAppService基类上配置[Route],利用[controller]占位符自动替换为子类名称:

[Route("api/services/app/baz/[controller]")]
public class BaseAsyncCrudAppService<TEntity, TDto> : AsyncCrudAppService<TEntity, TDto, Guid, PagedAndSortedResultRequestDto,
    TDto, TDto> where TEntity : class, IEntity<Guid> where TDto : IEntityDto<Guid>
{
    public BaseAsyncCrudAppService(IRepository<TEntity, Guid> repository)
        : base(repository)
    {
    }
}

这样MyFooAppService和MyBarAppService继承后,会自动生成:

  • /api/services/app/baz/MyFoo/...
  • /api/services/app/baz/MyBar/...

无需每个子类单独配置,批量实现路由前缀统一修改。

3. 模块级别全局配置(更灵活的批量管控)

如果需要针对整个模块内的所有AppService统一配置路由,可以在模块的ConfigureServices方法中通过AbpAspNetCoreMvcOptions设置:

public override void ConfigureServices(ServiceConfigurationContext context)
{
    Configure<AbpAspNetCoreMvcOptions>(options =>
    {
        options.ConventionalControllers.Create(typeof(你的模块类).Assembly, opts =>
        {
            // 设置根路径前缀
            opts.RootPath = "api/services/app/baz";
            // 可选:指定哪些类需要应用这个配置(比如所有以AppService结尾的类)
            opts.TypePredicate = type => type.Name.EndsWith("AppService");
        });
    });
}

这种方式适合批量管控整个模块的AppService路由,无需修改任何AppService类代码。

注意:你示例中写的Delete路径/api/services/baz/app/MyFoo/Delete是异常路径,类级别配置下所有方法会保持统一前缀,若需个别方法单独修改路由,才需要给对应方法单独添加[Route]特性,但这不符合你"无需逐个方法配置"的需求。

内容的提问来源于stack exchange,提问作者Karl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:07:04