利用 Panda.DynamicWebApi 快速构建动态 WebAPI —— 让你的应用逻辑“开口说话”

360影视 欧美动漫 2025-05-30 08:31 2

摘要:在 DDD 架构和微服务盛行的当下,我们时常会希望应用逻辑层能够直接“开口说话”——也就是说,服务类无需额外编写 Controller,就能直接暴露为标准 RESTful 风格的 Web API。

在 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(领域驱动设计)架构中的“应用服务层”。通过,你可以让服务类快速对外提供能力,极大减少开发工作量和维护成本。步骤 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

相关推荐