在 DDD 架构和微服务盛行的当下,我们时常会希望应用逻辑层能够直接“开口说话”——也就是说,服务类无需额外编写 Controller,就能直接暴露为标准 RESTful 风格的 Web API。Panda.DynamicWebApi
正是为此而生,可以根据你的业务类自动生成 API 接口,完美集成 Swagger,同时性能无忧。
本文将带你了解如何使用 Panda.DynamicWebApi 快速构建 Web API,并介绍其核心配置与进阶用法。
Panda.DynamicWebApi
是一款受 ABP 框架启发的 .NET Core 扩展组件,可根据规则自动将你的服务类转化为 RESTful API,无需编写冗余的 Controller 代码。默认集成 Swagger,API 文档清晰明了,且与手动创建 Controller 没有区别。
最适用于 DDD(领域驱动设计)架构中的“应用服务层”。通过 Panda.DynamicWebApi
,你可以让服务类快速对外提供能力,极大减少开发工作量和维护成本。
在 ASP.NET Core WebApi 项目中,通过 NuGet 安装:
Install-Package Panda.DynamicWebApi
创建一个类,实现 IDynamicWebApi
接口,并添加 [DynamicWebApi]
特性:
[DynamicWebApi]
publicclassAppleAppService : IDynamicWebApi
{
privatestaticreadonly Dictionary<int, string> Apples = new()
{
[1] = "Big Apple",
[2] = "Small Apple"
};
[HttpGet("{id:int}")]
public string Get(int id) => Apples.TryGetValue(id, outvar apple) ? apple : "No Apple!";
public IEnumerable<string> Get() => Apples.Values;
public void Update(UpdateAppleDto dto)
{
if (Apples.ContainsKey(dto.Id))
Apples[dto.Id] = dto.Name;
}
[HttpDelete("{id:int}")]
public void Delete(int id) => Apples.Remove(id);
}
在 Startup.cs
中添加注册逻辑:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddDynamicWebApi(options =>
{
options.DefaultApiPrefix = "apis";
options.RemoveActionPostfixes.Clear();
options.GetRestFulActionName = name => name;
options.AddAssemblyOptions(typeof(Startup).Assembly, apiPreFix: "apis");
});
}
services.AddSwaggerGen();
在 Configure
方法中启用:
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "API V1"));
运行项目,访问 /swagger/index.html
,你就能看到自动生成的 API 文档了。
要自动生成 API:
IDynamicWebApi
[DynamicWebApi]
特性根据方法名前缀,Panda.DynamicWebApi
会自动映射到合适的 HTTP 动词:
方法前缀 | 动词 |
---|---|
Create/Add/Post | POST |
Get/Find/Query | GET |
Update/Put | PUT |
Delete/Remove | DELETE |
例如:GetApple
→ GET /api/Apple
可以通过 ASP.NET Core 自带的 [HttpGet]
等特性手动覆盖。
你可以通过实现 ISelectController
和 IActionRouteFactory
接口来自定义 API 注册逻辑:
[AttributeUsage(AttributeTargets.Class)]
public class ServiceAttribute : Attribute
{
public string ServiceName { get; }
public ServiceAttribute(string name = "") => ServiceName = name;
}
自定义控制器选择器:
internal class ServiceLocalSelectController : ISelectController
{
public bool IsController(Type type) =>
type.IsPublic && type.GetCustomAttribute<ServiceAttribute>() != null;
}
自定义路由规则生成器:
internal class ServiceActionRouteFactory : IActionRouteFactory
{
public string CreateActionRouteModel(string area, string controller, ActionModel action)
{
var attr = action.ActionMethod.DeclaringType.GetCustomAttribute<ServiceAttribute>();
var serviceName = string.IsNullOrEmpty(attr?.ServiceName)
? controller.Replace("Service", "")
: attr.ServiceName.Replace("Service", "");
return $"api/{serviceName}/{action.ActionName.Replace("Async", "")}";
}
}
services.AddDynamicWebApiCore<ServiceLocalSelectController, ServiceActionRouteFactory>();
app.UseDynamicWebApi((sp, options) =>
{
options.AddAssemblyOptions(typeof(OtherService).Assembly);
});
这样,只要你的类标记了 [Service]
特性,就能自动变成一个 API 控制器,路由格式如 /api/ServiceName/Method
。
通过 DynamicWebApiOptions
可设置:
属性名 | 默认值 | 说明 |
---|---|---|
DefaultHttpVerb | POST | 默认 HTTP 动词 |
DefaultApiPrefix | api | 路由前缀 |
RemoveControllerPostfixes | AppService, ApplicationService | 类名后缀去除规则 |
RemoveActionPostfixes | Async | 方法名后缀去除规则 |
FormBodyBindingIgnoredTypes | IFormFile | 忽略表单类型参数 |
Panda.DynamicWebApi
极大简化了 API 的开发流程,特别适合中后台系统或微服务架构下的场景:
👉 项目地址:Panda.DynamicWebApi on NuGet