在实际的项目开发过程中,很多时候我们的很多业务逻辑都是写在Service层的,Controller只是简单的做一些调用Service层的API。为了方便开发减少重复工作,ABP.vNext提供了自动API注册的功能。
约定配置
ABP通过约定自动将ApplicationService生成API Controller。大多数时候并不需要关心其配置细节,但ABP同时也预留了很多接口让你可以进行自定义。
基本配置很简单。只需配置 AbpAspNetCoreMvcOptions
并使用ConventionalControllers.Create
方法,如下所示:
[DependsOn(BookStoreApplicationModule)]
public class BookStoreWebModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options
.ConventionalControllers
.Create(typeof(BookStoreApplicationModule).Assembly);
});
}
}
通过以上配置后,ABP会采用命名约定的方式,将Service中的方法映射为对应的HTTP Method,具体的映射规则如下所示:
-
Get: Used if the method name starts with 'GetList', 'GetAll' or 'Get'.
-
Put: Used if the method name starts with 'Put' or 'Update'.
-
Delete: Used if the method name starts with 'Delete' or 'Remove'.
-
Post: Used if the method name starts with 'Create', 'Add', 'Insert' or 'Post'.
-
Patch: Used if the method name starts with 'Patch'.
-
Otherwise, Post is used by default.
如果你需要自定义HttpMethod,可以使用
Microsoft.AspNetCore.MVC.Core
包的[HttpPost]/[HttpGet]/[HttpPut] 等特性来标记。
路由
由Auto API生成的路由,总是以 /api
开头,且默认跟上 /app
作为路径。如 /api/app/book。其中的 /app 是可以被自定义替换的,你可以在配置Auto API的时候童工 options
来指定,如下配置完成后,路径将变成 /api/volosoft/book-store/book。
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ConventionalControllers
.Create(typeof(BookStoreApplicationModule).Assembly, opts =>
{
opts.RootPath = "volosoft/book-store";
});
});
如果你想更换某个Service生成的Controller名称,可以使用 UrlControllerNameNormalizer
委托来实现。
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly, opt =>
{
opt.UrlControllerNameNormalizer = (url) =>
{
if (url.ControllerName.Equals(""))
{
return "";
}
return "";
};
});
});
路由策略
IConventionalRouteBuilder
用于构建路线。默认情况下,它由 ConventionalRouteBuilder
实现,并按上述说明工作。您可以替换/覆盖此服务以自定义路由计算策略。
ABP 4.0版本后的路由采用 kebab-case 的模式,4.0版本以前的路由采用 camelCase 模式。可以通过指定 UseV3UrlStyle
为true来使用 camelCase的模式。
options.ConventionalControllers
.Create(typeof(BookStoreApplicationModule).Assembly, opts =>
{
opts.UseV3UrlStyle = true;
});
以上配置只对当个BookStoreApplicationModule 有效,全局配置如下
Configure<AbpConventionalControllerOptions>(options =>
{
options.UseV3UrlStyle = true;
});
注意事项
并不是任何应用服务都会被自动映射成为HTTP API Controller的,其前提条件是该服务需要实现IRemoteService
接口或继承其实现类。ABP中 ApplicationService
类已实现IRemoteService,所以继承了ApplicationService
的服务自然就能映射成 HTTP API Controller了。
RemoteService Attribute
可用于将类标记为远程服务或禁用已实现 IRemoteService 接口的特定类。
[RemoteService(IsEnabled = false)] //or simply [RemoteService(false)]
public class PersonAppService : ApplicationService
{
}
RemoteService Attribute
还提供了一个IsMetadataEnabled
属性,用来设置在客户端是否暴露此API,当设置为false
时,客户端虽然看不到此API,但依然可以调用该API。
[RemoteService(IsMetadataEnabled = false)]
public class PersonAppService : ApplicationService
{
}
使用TypePredicate Options
也可以用来过滤哪些类可以成为API Controller,通过一下方式来配置,你可以指定某些类返回 false
来禁用其暴露为API Controller。
services.Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ConventionalControllers
.Create(typeof(BookStoreApplicationModule).Assembly, opts =>
{
opts.TypePredicate = type => { return true; };
});
});