.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");
});

官网

源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/909923.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[ 内网渗透实战篇-1 ] 单域环境搭建与安装域环境判断域控定位CS插件装载CS上线

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

还在使用ElementUI不如试一试DaisyUI,DaisyUI: Tailwind CSS 的高效组件库,

DaisyUI: Tailwind CSS 的高效组件库 daisyUI官网&#xff1a;https://daisyui.com/ 在现代网页开发中&#xff0c;快速构建美观且响应式的用户界面是每个开发者追求的目标。Tailwind CSS 是一个流行的实用程序优先的 CSS 框架&#xff0c;它允许开发者直接在 HTML 中使用预…

《大数据与人工智能:提升数据质量与数量的利器》

《大数据与人工智能&#xff1a;提升数据质量与数量的利器》 一、大数据与人工智能的融合趋势二、大数据增加数据数量的方法&#xff08;一&#xff09;不同途径的数据增量&#xff08;二&#xff09;数据增强的多样方法 三、人工智能提升数据数量的手段&#xff08;一&#xf…

通义灵码实操—飞机大战游戏

通义灵码实操—飞机大战游戏 有没有想象过自己独立编写一个有趣的小游戏。在本实践课程中&#xff0c;你不仅可以实现这个想法&#xff0c;而且还将得到通义灵码智能编程助手的支持与指导。我们将携手步入编程的神奇世界&#xff0c;以一种简洁、高效且具有创造性的方式&#…

AI之硬件对比:据传英伟达Nvidia2025年将推出RTX 5090-32GB/RTX 5080-24GB、华为2025年推出910C/910D

AI之硬件对比&#xff1a;据传英伟达Nvidia2025年将推出RTX 5090-32GB/RTX 5080-24GB、华为2025年推出910C/910D 目录 Nvidia的显卡 Nvidia的5090/5080/4090/4080&#xff1a;据传传英伟达Nvidia RTX 5090后续推出32GB版且RTX 5080后续或推出24GB版 RTX 5090相较于RTX 4090&…

7.2 设计模式

设计模式 7.3.1 设计模式的要素7.3.2 创建型设计模式7.3.3 结构性设计模式1. Adapter (适配器)2. Bridge(桥接)3.Composite(组合)4.Decorator(装饰)5.Facade(外观)6.Flyweight(享元)7.Proxy(代理)8. 结构型模式比较 7.3.4 行为型设计模式1 Chain of Responsibility 责任链模式2…

狐假虎威,数据流图其实很简单

不同于类图、用例图和顺序图等等UML里面的概念&#xff0c;DFD数据流图术语结构化分析的范畴。它从数据传递和加工角度&#xff0c;以图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程。 两句话来概括数据流图&#xff1a; 功能是用来描述整个系统中信息…

一周搞定模电!(2) 超详细!!新手小白必看!

目录 稳压二极管 整流二极管 开关二极管 电容 1、什么是电容 2、电容的作用 2.1 旁路的作用 2.2 去耦&#xff08;退耦&#xff09;电容的作用 2.3 滤波和储能 3.电容在电路中的连接问题 稳压二极管 嵌入式系统&#xff0c;作为一种专用计算机系统&#xff0c;被广泛…

CPU Study - Pipeline Basic

参考来源&#xff1a;《超标量处理器设计》—— 姚永斌 超标量处理器 一个程序执行时间的公式如下&#xff0c;而这个公式通常也反映了处理器的性能&#xff1a; 图中的CPI - Cycle Per Instruction也就是CPU每条指令需要的周期数量&#xff0c;CPI计算方法就是周期数量除以…

串口屏控制的自动滑轨(未完工)

序言 疫情期间自己制作了一个自动滑轨&#xff0c;基于无线遥控的&#xff0c;但是整体太大了&#xff0c;非常不方便携带&#xff0c;所以重新设计了一个新的&#xff0c;以2020铝型材做导轨的滑轨&#xff0c;目前2020做滑轨已经很成熟了&#xff0c;配件也都非常便宜&#x…

Python 自动化脚本集合:开源免费、跨平台、助你告别重复劳动、高效便捷完成各种任务!

引言 你是否也厌倦了重复繁琐的操作&#xff1f;让 Python-Geeks 的 Automation-scripts 库来替你完成重复工作&#xff01;这个仓库汇聚了200多个各种实用且高效的 Python 脚本&#xff0c;可以自动执行各种任务&#xff0c;让你从繁重的劳动中解放出来&#xff0c;真正享受生…

A011-基于SpringBoot的视频点播系统设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装视频点播系统软件来发挥其高效地信息处理的作用&#xff0c…

JAVA学习日记(十一) 常用API

一、Math //开平方根 public static double sqrt(double a); //返回结果 //开立方根 public static double cbrt(double a); 水题&#xff1a; public class Main {public static void main(String[] args) {//统计一共有多少个水仙花数 : abca^3b^3c^3abc// aabc/100%10//…

数据结构 —— 红黑树

目录 1. 初识红黑树 1.1 红黑树的概念 1.2 红⿊树的规则 1.3 红黑树如何确保最长路径不超过最短路径的2倍 1.4 红黑树的效率:O(logN) 2. 红黑树的实现 2.1 红黑树的基础结构框架 2.2 红黑树的插⼊ 2.2.1 情况1&#xff1a;变色 2.2.2 情况2&#xff1a;单旋变色 2.2…

Java多线程--Thread类的那些事3.--线程的6中状态和sleep()和 join()

一.sleep()方法 首先在Thead类中有一个静态的sleep()方法,可以让线程进入到休眠状态即TEMD-WAITING状 在调用sleep()方法时需要注意的是在哪个线程里面调用sleep()方法,哪个线程就会进入阻塞状态.,在这个线程中的其他线程不会发生阻塞, 只有当休眠时间到来这个线程才会继续执行…

MySQL表设计(三大范式 表的设计)

1.上讲约束复习&#xff1a; 1.NOT NULL 非空约束&#xff0c;被指定NOT NULL的列&#xff0c;值不允许为空(必填) 2. UNIQUE 唯一约束&#xff0c;这个列里的值在表中是唯一的&#xff0c;也就是说不能重复 3. PRIMARY KEY 主键约束&#xff0c;可以看做是NOT NULL和UNIQUE…

基于SpringBoot的免税商品优选购物商城的设计与实现

一、项目背景 从古至今&#xff0c;通过书本获取知识信息的方式完全被互联网络信息化&#xff0c;但是免税商品优选购物商城&#xff0c;对于购物商城工作来说&#xff0c;仍然是一项非常重要的工作。尤其是免税商品优选购物商城&#xff0c;传统人工记录模式已不符合当前社会…

RabbitMQ 存储机制

一、消息存储机制 不管是持久化的消息还是非持久化的消息都可以被写入到磁盘。持久化的消息在到达队列时就被写入到磁盘&#xff0c;非持久化的消息一般只保存在内存中&#xff0c;在内存吃紧的时候会被换入到磁盘中&#xff0c;以节省内存空间。这两种类型的消息的落盘处理都…

Kafka自动生产消息软件(自动化测试Kafka)

点击下载《Kafka服务端(含Zookeeper)一键自启软件》 点击下载《kafka客户端生产者消费者kafka可视化工具&#xff08;可生产和消费消息&#xff09;》 点击下载《Kafka自动生产消息软件》 1. 前言 在软件开发过程中&#xff0c;Kafka常被用作消息队列来处理特定的业务功能。为…

C#应用随系统启动 - 开源研究系列文章

上次写过一个随系统启动的例子&#xff0c;不过那个是写到注册表中的&#xff0c;自从更新Windows操作系统后就不好使了&#xff0c;所以就换了个方式&#xff0c;只是将应用的快捷方式添加到操作系统的启动目录里&#xff0c;这样随系统启动。 1、 项目目录&#xff1b; 2、 源…