iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c#代码生成URL地址的示例
  • 732
分享到

c#代码生成URL地址的示例

2024-04-02 19:04:59 732人浏览 安东尼
摘要

目录“头疼”“吃药”工具代码使用代码“头疼” 自己在用angular做项目时,前端要请求后端数据时的代码如下 this.Http.get("url/xxx") 这是请求一个U

“头疼”

自己在用angular项目时,前端要请求后端数据时的代码如下


this.Http.get("url/xxx")

这是请求一个URL地址数据最简单的代码,但是如此简单的代码还会遇到一些头疼的问题

  • URL地址拼写错误,有可能折腾半天才发现😑
  • 后端修改了地址没通知到前端,测试不到位就炸了,不是所有项目都有那么规范的接口变更流程😑
  • 查看代码的时候,看着URL地址,这个地址用途是哈?还要翻接口文档😑

“吃药”

为了解决这个问题,我们需要一个包含所有接口的文件


import { environment } from 'src/environments/environment';
export const webapi = {
  
  Auth: {
  	
    Controller: `${environment.host}/api/Auth`,
    
    GetUser: `${environment.host}/api/Auth/GetUser`,
    
    Login: `${environment.host}/api/Auth/Login`,
  },
}

那么请求代码就可以改成


this.http.get(WEBAPI.Auth.GetUser)

但是维护这个文件是件吃力的事情,作为一个时刻想着如何偷懒的程序员,吃力的事情就让计算机去干,所以写一个代码生成工具。

工具代码


    public static class BuildWebApiToTS
    {
        public static string Build(Assembly assembly, string prefix = "api/")
        {
            List<Controller> controllers = GetApis(assembly);
            string code = CreateCode(controllers);
            return code.ToString();
        }
        
        public static void BuildToFile(Assembly assembly, string path, string prefix = "api/")
        {
            var code = Build(assembly, prefix);
            string existsCode = "";
            if (System.io.File.Exists(path) == true)
                existsCode = System.IO.File.ReadAllText(path);

            if (existsCode != code)
                System.IO.File.WriteAllText(path, code);
        }

        #region 构造代码

        public static string CreateCode(List<Controller> controllers, string prefix = "api/")
        {
            StringBuilder code = new StringBuilder();
            code.AppendLine("import { environment } from 'src/environments/environment';");
            code.AppendLine("export const WebAPI = {");
            foreach (var coll in controllers.OrderBy(x => x.Name))
            {
                code.AppendLine($"  ");
                code.AppendLine($"  {coll.Name}: {{");
                code.AppendLine($"    Controller: `${{environment.host}}/{prefix}{coll.Name}`,");
                foreach (var action in coll.Actions.OrderBy(x => x.Name))
                {
                    code.AppendLine($"    ");
                    code.AppendLine($"    {action.Name}: `${{environment.host}}/{prefix}{coll.Name}/{action.Name}`,");
                }
                code.AppendLine($"  }},");
            }
            code.AppendLine($"}};");
            return code.ToString();
        }

        #endregion

        #region 获得接口清单

        public static List<Controller> GetApis(Assembly assembly)
        {
            List<Controller> controllers = new List<Controller>();
            var collTypes = assembly.GetTypes().Where(x => x.GetCustomAttributes(typeof(ApiControllerAttribute), false).Count() > 0);
            foreach (var collType in collTypes)
            {
                var controller = new Controller(collType.Name.Replace("Controller", ""));
                controller.ApiComments = collType.GetCustomAttribute<ApiCommentsAttribute>();
                controllers.Add(controller);
                controller.Actions.AddRange(GetTypeMembers(collType, typeof(HttpGetAttribute), "GET"));
                controller.Actions.AddRange(GetTypeMembers(collType, typeof(HttpPostAttribute), "POST"));
                controller.Actions.AddRange(GetTypeMembers(collType, typeof(HttpPutAttribute), "PUT"));
                controller.Actions.AddRange(GetTypeMembers(collType, typeof(HttpDeleteAttribute), "DELETE"));
            }
            return controllers;
        }
        private static List<Action> GetTypeMembers(Type type, Type whereType, string saveType)
        {
            var actonTypes = type.GetMembers().Where(x => x.GetCustomAttributes(whereType, false).Count() > 0);
            List<Action> actons = new List<Action>();
            foreach (var actonType in actonTypes)
            {
                var action = new Action(saveType, actonType.Name);
                action.ApiComments = actonType.GetCustomAttribute<ApiCommentsAttribute>();
                actons.Add(action);
            }
            return actons;
        }

        public record Controller(string Name)
        {
            public ApiCommentsAttribute ApiComments { get; set; }
            public List<Action> Actions { get; set; } = new List<Action>();
        }

        public record Action(string Type, string Name)
        {
            public ApiCommentsAttribute ApiComments { get; set; }
        }

        #endregion
    }

    public class ApiCommentsAttribute : Attribute
    {
        public string Title { get; set; }
        public ApiCommentsAttribute(string title)
        {
            Title = title;
        }
    }

使用代码


#if DEBUG
	BuildWebApiToTS.BuildToFile(typeof(Program).Assembly, "ClientApp/src/app/web-api.ts");
#endif

上面代码大概的流程就是

  1. 利用反射读取程序集中包含ApiControllerAttribute特性的类
  2. 利用发射读取HttpGetAttributeHttpPostAttributeHttpPutAttributeHttpDeleteAttribute特性的方法
  3. 根据需要的格式生成代码
  4. 将代码文件写入ClientApp/src/app/web-api.ts

有了这个东西带来以下好处

  1. URL地址拼写错误问题,不存在的🎉
  2. 后端修改了接口,前端直接编译不过,立即发现问题🎉
  3. 鼠标停留,接口注释就显示了🎉

以上就是C#代码生成URL地址的方法的详细内容,更多关于c#代码生成URL地址的资料请关注编程网其它相关文章!

--结束END--

本文标题: c#代码生成URL地址的示例

本文链接: https://www.lsjlt.com/news/123317.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c#代码生成URL地址的示例
    目录“头疼”“吃药”工具代码使用代码“头疼” 自己在用Angular做项目时,前端要请求后端数据时的代码如下 this.http.get("url/xxx") 这是请求一个U...
    99+
    2024-04-02
  • Spring MVC URL地址映射的示例代码
    目录1.@RequestMapping的介绍2.映射单个URL3.映射多个URL4.映射URL在控制器上5.@RequestMapping的常用属性5.1value属性5.2meth...
    99+
    2024-04-02
  • C++生成随机浮点数的示例代码
    目录前言rand生成随机数问题出现初步解决最终方法生成等概率随机数生成随机整数生成随机浮点数生成非均匀分布随机数正态分布随机数二项分布的布尔值前言 在C++11之前,我们通常采用ra...
    99+
    2024-04-02
  • jquery中邮箱地址 URL网站地址正则验证实例代码
    email地址验证 复制代码 代码如下:function checkEmail(){    var email=$.trim($("#repo...
    99+
    2022-11-15
    邮箱地址 URL地址 正则
  • js生成二维码的示例代码
    前段时间项目中需要开发扫描二维码查看信息的功能,在网上查了一些资料,把用过的方法进行总结需要导入一个qrcode的js 插件。 插件链接: qrcode.js下载地址,点击即可下载 ...
    99+
    2024-04-02
  • mybatis plus自动生成代码的示例代码
    写一个简单的mybatis plus插件自动生成代码的例子 pom.xml 添加配置 <!-- mybatis plus 插件--> <dependency>...
    99+
    2024-04-02
  • PHP生成饼图的示例代码
    首先要把php_iconv.dll和inconv.dll COPY到c:\winnt\system32下,直接上代码: < define("ANGLE_STEP", 5); /...
    99+
    2022-12-21
    PHP生成饼图 PHP 饼图
  • vue3生成随机密码的示例代码
    目录实现效果实现思路完成布局完成生成随机数的方法完成生成随机密码的方法部分代码总结实现效果 实现思路 完成布局完成生成随机数的方法完成生成随机密码的方法 完成布局 布局直接用ele...
    99+
    2024-04-02
  • C#实现封面图片生成器的示例代码
    目录实现功能开发环境实现代码实现效果这个东西我已经用了有段时间了,从开始写文章就在用这个,主要原因还是因为我比较懒。懒得去寻找图片,同时又怕万一惹来版权争议。。。 跟我所有的文章的...
    99+
    2024-04-02
  • Tomcat中使用ipv6地址的示例代码
    目录1、替换老版本Tomcat2、项目无法启动3、Tomcat7拦截特殊字符4、设置IPV6的监听在公司的一次项目改造过程中,需要将原来的IPV6替换成IPV4。查询资料资料之后,你...
    99+
    2024-04-02
  • Java随机生成姓名,手机号,住址代码示例
    这篇文章主要是关于Java随机生成姓名,手机号,住址的代码,你要是问我有什么用,我也不知道,纯粹练习吧。随机生成测试数据import java.util.HashMap;import java.util.Map;public class R...
    99+
    2023-05-30
    java 基础 随机生成
  • C#实现文字视频生成器的示例代码
    目录前言实现功能开发环境实现代码实现效果前言 简单的描述下写这个软件的背景吧。之前短视频平台很火的时候,相信很多人都想进去分一杯羹,俺当然也不能免俗,但是人丑家穷又没才艺,咋办呢?看...
    99+
    2024-04-02
  • Nhibernate与代码生成的示例分析
    这篇文章主要为大家展示了“Nhibernate与代码生成的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Nhibernate与代码生成的示例分析”这篇文章吧。在向大家详细介绍Nhiber...
    99+
    2023-06-17
  • MyBatisPlus代码生成器的使用示例
    目录导入依赖表结构当前项目结构配置代码生成器1、globalConfig 全局策略配置2、dataSourceConfig 数据源配置AutoGenerator 是 MyBatis-...
    99+
    2024-04-02
  • vue3获取url地址参数的示例详解
    目录vue3获取url地址参数附录:Vue3获取地址栏参数一、查询参数二、路径参数三、注意点vue3获取url地址参数 import { useRouter, useRoute } ...
    99+
    2023-05-17
    Vue3 url地址参数 Vue3获取地址栏参数
  • PHP实现生成二维码的示例代码
    目录前言1、目前有2种类型的二维码2、用户扫描带场景值二维码时,可能推送以下两种事件3、创建二维码ticket4、临时二维码请求说明5、永久二维码请求说明6、临时二维码和永久二维码生...
    99+
    2024-04-02
  • C++利用GPAC实现生成MP4文件的示例代码
    目录一、MP4Writer类二、写h264流数据为mp4文件步骤三、写h265流数据为mp4文件步骤四、利用命令行生成mp4文件GPAC主要针对学生和内容创作者,代表了一个跨平台的多...
    99+
    2023-02-06
    C++ GPAC生成MP4文件 C++生成MP4文件 C++ GPAC MP4
  • Unity中 mesh生成斜坡的示例代码
    Mesh概念: Mesh是Unity中的一个组件,称为网格组件。通俗的讲,Mesh是指模型的网格,3D模型是由多边形拼接而成,而多边形实际上是由多个三角形拼接而成的。所以一个3D模型...
    99+
    2024-04-02
  • java 生成文字图片的示例代码
    本文主要介绍了java 生成文字图片的示例代码,分享给大家,具体如下:import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java...
    99+
    2023-05-31
    java 生成文字图片 ava
  • Mybatis-Plus代码生成器的示例分析
    小编给大家分享一下Mybatis-Plus代码生成器的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 实战 数据库脚本 创建一张商品表test_goodsCREATE&nbs...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作