ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ABP.vNext系列之Auto API

2022-04-27 09:01:31  阅读:269  来源: 互联网

标签:vNext Create BookStoreApplicationModule ABP Controller API options


​ 在实际的项目开发过程中,很多时候我们的很多业务逻辑都是写在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; };
            });
});

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有