在WebApi架构体系中,一般需要先编写应用服务实现,再通过编写Controller来实现应用服务的Web接口。Controller中的代码作用仅仅是调用Service的方法,将Service提升为Web接口,其实完全可以通过动态生成WebApi来减少编码工作。在.Net示例项目ABP中已经实现了动态生成WebApi的功能,Panda.DynamicWebApi项目将这部分代码进行了抽取和封装,我们可以通过引用Panda.DynamicWebApi项目来实现动态生成WebApi。

第一步,通过Nuget添加Panda.DynamicWebApi的项目引用

Panda.DynamicWebApi
  • 1.

在VS2019的Nuget包管理器中,搜索并添加Panda.DynamicWebApi的项目引用。

第二步,给Service添加[DynamicWebApi]特性,并继承IDynamicWebApi接口

[DynamicWebApi]
[ApiExplorerSettings(GroupName = "v1")]
[Authorize]
public class AdminService:IDynamicWebApi
{
/// <summary>
/// 用户仓储接口
/// </summary>
private readonly IBaseRepository<Admin> repository;
/// <summary>
/// 公共类(帮助)
/// </summary>
private readonly AdminUtility adminUtility;
/// <summary>
/// 配置接口
/// </summary>
IConfiguration configuration;
public AdminService(IBaseRepository<Admin> repository,AdminUtility adminUtility,IConfiguration configuration)
{
    this.repository = repository;
    this.adminUtility = adminUtility;
    this.configuration = configuration;
}
/// <summary>
/// 获取用户信息
/// </summary>
/// <returns></returns>
[HttpGet("/admin/GetAll")]
public  async Task<List<Admin>> GetAdminListAsync()
{
    return  await repository.GetListAsync();
}
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.

注意:

(1)DynamicWebApi默认的服务命名后缀是AppService,这个可以配置;

(2)使用DynamicWebApi,必须在服务类上添加特性[ApiExplorerSettings(GroupName = "v1")],指定GroupName才能让Swagger展示接口;

(3)DynamicWebApi有一套默认的请求方式命名规则,这个可以自行配置,也可配置为全部是POST方式

第三步,在Startup类/Program中的ConfigureServices/Builder方法中,配置启用DynamicWebApi

builder.Services.AddDynamicWebApi((options) =>
{
    //指定全局默认的api前缀
    options.DefaultApiPrefix = null;
    //指定全局默认的去除控制器后缀
    options.RemoveControllerPostfixes = new List<string>() { "Service" };
    //清空Api结尾
    options.RemoveActionPostfixes.Clear();
    //自定义ActionName 处理函数
    options.GetRestFulActionName = (actionName) => actionName;
});
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

配置完成后就可以在服务层实现接口的调用,不需要通过控制器来配置接口。