当前位置: 首页 > news >正文

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

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

  1. 安装
Panda.DynamicWebApi         1.2.2   1.2.2
Swashbuckle.AspNetCore      6.2.3   6.2.3
  1. 添加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", "")}";}}
}
  1. 添加ServiceLocalSelectController
public class ServiceLocalSelectController : ISelectController{public bool IsController(Type type){return type.IsPublic && type.GetCustomAttribute<ServiceAttribute>() != null;}}
  1. 添加注解
[AttributeUsage(AttributeTargets.Class)]public class ServiceAttribute : Attribute{public ServiceAttribute(){ServiceName = string.Empty;}public ServiceAttribute(string serviceName){ServiceName = serviceName;}public string ServiceName { get; }}
  1. 添加自定义服务
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>
  1. 依赖注入
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");
});

官网

源码

http://www.lryc.cn/news/476889.html

相关文章:

  • Spring框架和Spring Boot框架都使用注解来简化配置和提高开发效率,但它们之间存在一些区别
  • 从数据提取到管理:TextIn平台的全面解析与产品体验
  • 2024 Rust现代实用教程 Error错误处理
  • android 逆向破解360加固(MT管理器反编译)
  • 使用 SSH 蜜罐提升安全性和记录攻击活动
  • 无人机拦截捕获/直接摧毁算法详解!
  • 后端eclipse——文字样式:UEditor富文本编辑器引入
  • thinkphp6 redis 哈希存储方式以及操作函数(笔记)
  • 「Mac畅玩鸿蒙与硬件28」UI互动应用篇5 - 滑动选择器实现
  • 【嵌入式】STM32中的SPI通信
  • 后端:Spring、Spring Boot-配置、定义bean
  • 【Git】Git 远程仓库命令详解
  • html简易流程图
  • Java 入门
  • JVM基本结构和垃圾回收机制
  • CentOS 7 安装 ntp,自动校准系统时间
  • Spring Boot 配置文件启动加载顺序
  • webrtc agc2实现原理
  • 2024.11.03 周报
  • Oceanbase学习之一迁移mysql数据到oceanbase
  • Milvus - GPU 索引类型及其应用场景
  • Webserver(2.8)守护进程
  • HarmonyOS :
  • C# EF 使用
  • 简介Voronoi图Voronoi Diagrams
  • 硬件测试工程师之EMC项目-辐射抗扰度试验(RS)测试标准解析思维导图
  • H265编码丢帧问题分析
  • CentOS Linux教程(12)--常用编辑器
  • 【浏览器学习笔记】-- 浏览器检查jQuery是否加载
  • 大模型的提示学习