其他分享
首页 > 其他分享> > ABP.vNext系列之Auto API

ABP.vNext系列之Auto API

作者:互联网

​ 在实际的项目开发过程中,很多时候我们的很多业务逻辑都是写在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,具体的映射规则如下所示:

路由

​ 由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; };
            });
});

标签:vNext,Create,BookStoreApplicationModule,ABP,Controller,API,options
来源: https://www.cnblogs.com/jesen1315/p/16197516.html