ABP-VNEXT 学习笔记(四)自动API 控制器

官方文档地址:https://docs.abp.io/en/abp/latest/API/Auto-API-Controllers

 

详细的请阅读官方文档,这边侧重简化说明怎么应用和一些注意要点。

自动API,即代码端只需要定义服务层即可,无需每一个服务层方法都对应在控制器中编写一个action。

这个可以大大节省我们的时间和省略大量控制器端的代码。

该示例项目,我们建了一个ApplicationContract 接口层,一个Application 服务层,两个web项目。

 

 

接口层如下:

我们定义了2个接口,分别是获取姓名和年龄。

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;

namespace AbpAPI
{
    public interface IStudentService:IApplicationService
    {

        Task<string> GetNameAsync();

        Task<int> GetAgeAsync();


    }
}

 

服务层实现:

using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Services;

namespace AbpAPI
{

    public class StudentService : ApplicationService, IStudentService
    {


        [RemoteService(IsEnabled =false)]  //该设置表示该方法不自动生成api,但不影响直接调用。
        public async Task<int> GetAgeAsync()
        {
            return await Task.FromResult(18);
        }

        public async Task<string> GetNameAsync()
        {
            return await Task.FromResult("李四");
        }
    }
}

 

下面是web层的注入:

using Microsoft.OpenApi.Models;
using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;
using Volo.Abp.Swashbuckle;

namespace AbpAPI.Web
{
    [DependsOn(typeof(AbpAPIApplicationModule))]
    [DependsOn(typeof(AbpAspNetCoreMvcModule))]
    [DependsOn(typeof(AbpSwashbuckleModule))]
    [DependsOn(typeof(AbpAutofacModule))]
    public class AbpAPIWebModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            base.ConfigureServices(context);
            //注入自动API
            Configure<AbpAspNetCoreMvcOptions>(options =>
            {
                options
                    .ConventionalControllers
                    .Create(typeof(AbpAPIApplicationModule).Assembly);  //设置哪个类库要自动API,可配置多个服务实现层
            });

            //下面是自动生成swaggerUI
            var services = context.Services;
            services.AddAbpSwaggerGen(options =>
        {
            options.SwaggerDoc("v1", new OpenApiInfo { Title = "动态API", Version = "v1" });
            options.DocInclusionPredicate((docName, description) => true);
            options.CustomSchemaIds(type => type.FullName);

        }
    );

        }

        public override void OnApplicationInitialization(ApplicationInitializationContext context)
        {
            
            var app = context.GetApplicationBuilder();

            //应用swaggerUI
            app.UseSwagger();
            app.UseAbpSwaggerUI(options =>
            {
                options.SwaggerEndpoint("/swagger/v1/swagger.json", "动态API");
            });

            base.OnApplicationInitialization(context);
        }
    }
}

 

这里面做了2个配置

若单单配置自动API,只需要

  //注入自动API
            Configure<AbpAspNetCoreMvcOptions>(options =>
            {
                options
                    .ConventionalControllers
                    .Create(typeof(AbpAPIApplicationModule).Assembly);  //设置哪个类库要自动API,可配置多个服务实现层
            });

 

配置swaggerUI是方便我们查看api内容和模拟请求。

这样,就完成了自动API的配置。

有个点需要注意看官方文档的, 就是关于请求方式和url路径。官方文档做了详细说明。在路径默认固定以 /api/app/开头,方法名中的Get和async,service都会被清掉。

比如StudentService下的GetName方法,最终请求的url是 /api/app/student/name

下面我们运行起来,看swagger

 

 

 

可以看到,这时候只有getname方法是有生成API,GetAge是没有的。

 

至此,自动生成API的应用就这么简单。

 

更多分享,请大家关注我的个人公众号:

 

 

posted @ 2022-08-25 18:11  黄明辉  阅读(1260)  评论(0编辑  收藏  举报