• ABP.vNext系列之Auto API chef


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

  • 相关阅读:
    js刷新
    getHibernateTemplate()为NUll
    struts2+hibernate+spring+jquery返回json List列表
    windowopen
    web配置详解
    缓存
    uuid-不好之处
    多对多转化一对多
    多对多拆成两个 多对一
    我的github地址账号和密码
  • 原文地址:https://www.cnblogs.com/jesen1315/p/16197516.html
Copyright © 2020-2023  润新知