我们以前是通过创建controller来创建API,通过controller来显示的生成路由,这里我们讲解下如何不通过controller,构造API路由
- 安装
Panda.DynamicWebApi 1.2.2 1.2.2
Swashbuckle.AspNetCore 6.2.3 6.2.3
- 添加ServiceActionRouteFactory
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Panda.DynamicWebApi;
using System.Reflection;
namespace DynamicControllerAPI.Dynamic
{
public class ServiceActionRouteFactory : IActionRouteFactory
{
public string CreateActionRouteModel(string areaName, string controllerName, ActionModel action)
{
var controllerType = action.ActionMethod.DeclaringType;
var serviceAttribute = controllerType.GetCustomAttribute<ServiceAttribute>();
var _controllerName = serviceAttribute.ServiceName == string.Empty ? controllerName.Replace("Service", "") : serviceAttribute.ServiceName.Replace("Service", "");
return $"api/{_controllerName}/{action.ActionName.Replace("Async", "")}";
}
}
}
- 添加ServiceLocalSelectController
public class ServiceLocalSelectController : ISelectController
{
public bool IsController(Type type)
{
return type.IsPublic && type.GetCustomAttribute<ServiceAttribute>() != null;
}
}
- 添加注解
[AttributeUsage(AttributeTargets.Class)]
public class ServiceAttribute : Attribute
{
public ServiceAttribute()
{
ServiceName = string.Empty;
}
public ServiceAttribute(string serviceName)
{
ServiceName = serviceName;
}
public string ServiceName { get; }
}
- 添加自定义服务
namespace DynamicControllerAPI.Dynamic
{
[Service("Other.Server")]
public class OtherService
{
public readonly SingleClass _singleClass;
public OtherService(SingleClass singleClass)
{
_singleClass = singleClass;
}
public int Create()
{
return 100;
}
public string GetUserName()
{
return _singleClass.getName();
}
public Task<int> TaskIntAsync()
{
return Task.FromResult(100);
}
}
public class SingleClass
{
public string getName()
{
return "ellis";
}
}
}
6. 修改工程文件DynamicControllerAPI.csproj添加如下
其中xml名字与工程名一致
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DocumentationFile>bin\Debug\net6.0\DynamicControllerAPI.xml</DocumentationFile>
<NoWarn>1701;1702;CS1591</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DocumentationFile>bin\Release\net6.0\DynamicControllerAPI.xml</DocumentationFile>
<NoWarn>1701;1702;CS1591</NoWarn>
</PropertyGroup>
- 依赖注入
builder.Services.AddDynamicWebApiCore<ServiceLocalSelectController, ServiceActionRouteFactory>();
// 注册Swagger生成器,定义一个和多个Swagger 文档
builder.Services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new OpenApiInfo() { Title = "Dynamic WebApi", Version = "v1" });
// 确保包含所有控制器
options.DocInclusionPredicate((docName, description) => true);
// XML 文件路径
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
Console.WriteLine($"XML Path: {xmlPath}"); // 调试路径输出
options.IncludeXmlComments(xmlPath);
});
builder.Services.AddSingleton<SingleClass>();
// 启用中间件服务生成Swagger作为JSON终结点
app.UseSwagger();
// 启用中间件服务对swagger-ui,指定Swagger JSON终结点
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Dynamic WebApi v1");
});
官网
源码