.net Core 使用Panda.DynamicWebApi动态构造路由

我们以前是通过创建controller来创建API,通过controller来显示的生成路由,这里我们讲解下如何不通过controller,构造API路由

  1. 安装
bash 复制代码
Panda.DynamicWebApi         1.2.2   1.2.2
Swashbuckle.AspNetCore      6.2.3   6.2.3
  1. 添加ServiceActionRouteFactory
csharp 复制代码
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", "")}";
        }
    }
}
  1. 添加ServiceLocalSelectController
csharp 复制代码
public class ServiceLocalSelectController : ISelectController
    {
        public bool IsController(Type type)
        {
            return type.IsPublic && type.GetCustomAttribute<ServiceAttribute>() != null;
        }
    }
  1. 添加注解
csharp 复制代码
[AttributeUsage(AttributeTargets.Class)]
    public class ServiceAttribute : Attribute
    {
        public ServiceAttribute()
        {
            ServiceName = string.Empty;
        }

        public ServiceAttribute(string serviceName)
        {
            ServiceName = serviceName;
        }

        public string ServiceName { get; }
    }
  1. 添加自定义服务
csharp 复制代码
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";
        }
    }
}
  1. 修改工程文件DynamicControllerAPI.csproj添加如下

其中xml名字与工程名一致

bash 复制代码
  <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>
  1. 依赖注入
bash 复制代码
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");
});

官网

源码

相关推荐
时光追逐者5 天前
C#/.NET/.NET Core技术前沿周刊 | 第 49 期(2025年8.1-8.10)
c#·.net·.netcore
切糕师学AI5 天前
在 .NET Core 5.0 中启用 Gzip 压缩 Response
.netcore
周杰伦fans6 天前
.NET Core MVC中CSHTML
mvc·.netcore
爱吃香蕉的阿豪13 天前
乐思 AI 智能识别平台(基于 YOLO,.NET+Vue3 开发)开源指南
人工智能·yolo·开源·aigc·.netcore
时光追逐者13 天前
C#/.NET/.NET Core优秀项目和框架2025年7月简报
c#·.net·.netcore
步、步、为营18 天前
.NET Core 3.1 升级到 .NET 8
microsoft·.net·.netcore
时光追逐者20 天前
C#/.NET/.NET Core技术前沿周刊 | 第 48 期(2025年7.21-7.27)
c#·.net·.netcore·.net core
爱吃香蕉的阿豪20 天前
SignalR 全解析:核心原理、适用场景与 Vue + .NET Core 实战
vue.js·microsoft·c#·.netcore·signalr
工藤新一OL22 天前
把xml的格式从utf-8-bom转为utf-8
xml·c#·asp.net·.netcore·visual studio
王柏龙22 天前
Asp.net core mvc中TagHelper的GetChildContentAsync和Content区别
mvc·.netcore