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