代碼生成

来源:https://www.cnblogs.com/lsgControl/archive/2022/11/02/16850858.html
-Advertisement-
Play Games

namespace Qingyun.QingBaiFang.V2.APITest.Web { using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Collections.Generic; using System.Text ...


namespace Qingyun.QingBaiFang.V2.APITest.Web
{
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System;

    /// <summary>
    /// 構建
    /// </summary>
    [TestClass]
    public class BuildCodeTest
    {
        private string _basePath;

        /// <summary>
        /// 構造
        /// </summary>
        public BuildCodeTest()
        {
            _basePath = Directory.GetParent(AppContext.BaseDirectory).Parent.Parent.Parent.Parent.FullName;
        }

        /// <summary>
        /// 構建
        /// </summary>
        [TestMethod]
        public void ApprovalMeetingSubmit()
        {
            string controllerName = "BuliuderCodeController";
            string controllerRemark = "BuliuderCodeController";
            string actionName = "Demo";
            string actionRemark = "Demo";
            string requstClass = "WebDemoInput";
            string responeseClass = "WebDemoOutput";
            string inheritName = "IDenpendency";
            string managerClassName = "BuliuderCodeManager";
            CreateController(controllerName, controllerRemark, inheritName);
            CreateControllerAction(controllerName, actionName, actionRemark, requstClass, responeseClass);
            CreateInputModel(requstClass, actionRemark);
            CreateOutputModel(requstClass, actionRemark);
            CreateManagerClass(managerClassName, controllerRemark);
            CreateManagerAction(managerClassName, actionName, actionRemark, requstClass, responeseClass);
        }

        /// <summary>
        /// 模板
        /// </summary>
        public void TempCode()
        {
            /*
             *  控制器類或方法
             *  管理類或方法
             *  服務介面類或方法
             *  服務實現類或方法
             *  入參類
             *  出參類
             *  枚舉類
             *  數據類
             */
        }

        /// <summary>
        /// 創建控制器方法
        /// </summary>
        /// <param name="controllerName">控制器名</param>
        /// <param name="actionName">方法名</param>
        /// <param name="actionRemark">方法備註</param>
        /// <param name="requstClass">入參的類名</param>
        /// <param name="responeseClass">出參的類名</param>
        public void CreateControllerAction(string controllerName, string actionName, string actionRemark, string requstClass, string responeseClass)
        {
            List<string> attributeNames = new List<string>();

            string codePath = Path.Combine(_basePath, "API", "Controllers", $"{controllerName}.cs");

            var controllerCodes = File.ReadAllLines(codePath);
            var code = ActionBuilder(actionName, actionRemark, requstClass, responeseClass, attributeNames);
            StringBuilder app = new StringBuilder();
            for (var i = 0; i < controllerCodes.Length - 2; i++)
            {
                app.AppendLine(controllerCodes[i]);
            }

            app.AppendLine(code);
            app.AppendLine($"    }}");
            app.AppendLine($"}}");
            File.WriteAllText(codePath, app.ToString());
        }

        /// <summary>
        /// 創建控制器
        /// </summary>
        /// <param name="className">控制器名</param>
        /// <param name="classRemark">方法名</param>
        /// <param name="inheritName">方法備註</param>
        public void CreateController(string className, string classRemark, string inheritName)
        {
            string nameSpace = "BuliuderCodeController";
            List<string> usingNames = new List<string>();
            string codePath = Path.Combine(_basePath, "API", "Controllers", $"{className}.cs");
            if (!Directory.Exists(codePath))
            {
                string controllerCode = ClassBuilder(className, classRemark, inheritName, nameSpace, usingNames);
                File.WriteAllText(codePath, controllerCode);
            }
        }

        /// <summary>
        /// 創建入參類
        /// </summary>
        /// <param name="className">類名</param>
        /// <param name="classRemark">備註</param>
        public void CreateInputModel(string className, string classRemark)
        {
            string nameSpace = "Qingyun.QingBaiFang.V2.Common.DTOWeb.Input";
            string codePath = Path.Combine(_basePath, "Common", "DTOWeb", "Input", $"{className}.cs");
            string inheritName = string.Empty;
            List<string> usingNames = new List<string>();

            if (!Directory.Exists(codePath))
            {
                string classCode = ClassBuilder(className, classRemark, inheritName, nameSpace, usingNames);
                File.WriteAllText(codePath, classCode);
            }
        }

        /// <summary>
        /// 創建出參類
        /// </summary>
        /// <param name="className">類名</param>
        /// <param name="classRemark">備註</param>
        public void CreateOutputModel(string className, string classRemark)
        {
            string nameSpace = "Qingyun.QingBaiFang.V2.Common.DTOWeb.Output";
            string codePath = Path.Combine(_basePath, "Common", "DTOWeb", "Output", $"{className}.cs");
            string inheritName = string.Empty;
            List<string> usingNames = new List<string>();

            if (!Directory.Exists(codePath))
            {
                string classCode = ClassBuilder(className, classRemark, inheritName, nameSpace, usingNames);
                File.WriteAllText(codePath, classCode);
            }
        }

        /// <summary>
        /// 創建管理類
        /// </summary>
        /// <param name="className">類名</param>
        /// <param name="classRemark">備註</param>
        public void CreateManagerClass(string className, string classRemark)
        {
            string nameSpace = "Qingyun.QingBaiFang.V2.Service.Manager.Demo";
            string codePath = Path.Combine(_basePath, "Service", "Manager", "Demo", $"{className}.cs");
            string inheritName = "IDenpendency";
            List<string> usingNames = new List<string>();

            if (!Directory.Exists(codePath))
            {
                string classCode = ClassBuilder(className, classRemark, inheritName, nameSpace, usingNames);
                File.WriteAllText(codePath, classCode);
            }
        }

        /// <summary>
        /// 創建管理類方法
        /// </summary>
        /// <param name="className">類名</param>
        /// <param name="actionName">方法名</param>
        /// <param name="actionRemark">方法備註</param>
        /// <param name="requstClass">入參的類名</param>
        /// <param name="responeseClass">出參的類名</param>
        public void CreateManagerAction(string className, string actionName, string actionRemark, string requstClass, string responeseClass)
        {
            List<string> attributeNames = new List<string>();

            string codePath = Path.Combine(_basePath, "Service", "Manager", "Demo", $"{className}.cs");

            var controllerCodes = File.ReadAllLines(codePath);
            var code = ActionBuilder(actionName, actionRemark, requstClass, responeseClass, attributeNames);
            StringBuilder app = new StringBuilder();
            for (var i = 0; i < controllerCodes.Length - 2; i++)
            {
                app.AppendLine(controllerCodes[i]);
            }

            app.AppendLine(code);
            app.AppendLine($"    }}");
            app.AppendLine($"}}");
            File.WriteAllText(codePath, app.ToString());
        }

        /// <summary>
        /// 生成Code
        /// </summary>
        /// <param name="actionName">方法名</param>
        /// <param name="actionRemark">方法備註</param>
        /// <param name="requstClass">入參的類名</param>
        /// <param name="responeseClass">出參的類名</param>
        /// <param name="attributeNames">特性([HttpGet(\"GetDetailSearch\")])</param>
        /// <returns>生成的代碼</returns>
        public string ActionBuilder(string actionName, string actionRemark, string requstClass, string responeseClass, List<string> attributeNames)
        {
            // 控制器類或方法
            StringBuilder app = new StringBuilder();
            app.AppendLine($"");
            app.AppendLine($"        /// <summary>");
            app.AppendLine($"        /// {actionRemark}");
            app.AppendLine($"        /// </summary>");
            app.AppendLine($"        /// <param name=\"input\">入參</param>");
            app.AppendLine($"        /// <returns>結果</returns>");
            foreach (var item in attributeNames)
            {
                app.AppendLine($"        {item}");
            }

            app.AppendLine($"        public async Task<{responeseClass}> {actionName}({requstClass} input)");
            app.AppendLine($"        {{");
            app.AppendLine($"           return await _meetingManager.{actionName}(input);");
            app.AppendLine($"        }}");

            return app.ToString().Trim();
        }

        /// <summary>
        /// ClassBuilder
        /// </summary>
        /// <param name="className">類名</param>
        /// <param name="classRemark">備註</param>
        /// <param name="inheritName">繼承類(ITask)</param>
        /// <param name="nameSpace">命名空間(Qingyun.QingBaiFang.V2.Service.Service.Tasks)</param>
        /// <param name="usingNames">引用類</param>
        /// <returns>生成的Code</returns>
        public string ClassBuilder(string className, string classRemark, string inheritName, string nameSpace, List<string> usingNames)
        {
            StringBuilder app = new StringBuilder();

            app.AppendLine($"namespace {nameSpace}");
            app.AppendLine($"{{");
            foreach (var item in usingNames)
            {
                app.AppendLine($"{item.Trim(';')};");
            }

            if (usingNames.Count > 0)
            {
                app.AppendLine($"");
            }

            app.AppendLine($"    /// <summary>");
            app.AppendLine($"    /// {classRemark}");
            app.AppendLine($"    /// </summary>");
            if (string.IsNullOrEmpty(inheritName))
            {
                app.AppendLine($"    public class {className}");
            }
            else
            {
                app.AppendLine($"    public class {className} : {inheritName}");
            }

            app.AppendLine($"    {{");
            app.AppendLine($"    }}");
            app.AppendLine($"}}");

            return app.ToString().Trim();
        }
    }
}

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 輪播圖組件 <template> <div id="banner"> <el-carousel height="400px"> <!-- 將banner_list迴圈--> <el-carousel-item v-for="item in banner_list" :key="item"> <!-- ...
  • 軟體技術基礎學習筆記(2)——獨立完成一個項目 | 這個作業屬於哪個課程 | <首頁 - 22軟體基礎 - 浙江理工大學 - 班級博客 - 博客園> | | | | | 這個作業的目標 | <在限定的期限內,完成一個滿足客戶要求的項目> | | 姓名-學號 | <曾翊>-<2020330301215 ...
  • 文章目錄 🦠一、前言 🦠二、軟體開發架構 🍀2.1、C/S架構 🍀2.2、B/S架構 🍀2.3、服務端與客戶端 🦠三、ip與埠號 🍀3.1、IP地址與埠號常識 🍀3.2、MAC和IP的概念與不同 🦠四、tcp協議和udp協議 🦠五、乙太網:區域網與交換機 🍀5.1、什麼是局 ...
  • 前言 環境使用 Python 3.8 Pycharm 模塊使用 requests jieba 結巴分詞 wordcloud 詞雲 數據來源分析 明確需求 <數據來源分析> 採集數據是什麼東西? 通過那個url地址得到想要數據的內容 抓包分析: 瀏覽器自帶工具 --> 開發者工具I. F12 或者 鼠 ...
  • 邏輯導航 1.當一訪問127.0.0.1:8000時,就會向某一地址發送請求 2.請求介面需要返迴首頁所需要的輪播圖片 3.前端vue輪播圖組件迴圈一下後端發送的圖片連接列表,依次展示輪播圖 輪播圖表設計 輪播圖中一些共有的欄位,我們可以創建一個公共的基礎表,以後需要該欄位直接基礎該表就行 基表,可 ...
  • 疫情尚未結束,我們需要做好自己,時刻防範,不給別人添麻煩。 今天我們來嘗試用Python抓取世界疫情,實現可視化地圖展示。 話不多說直接開搞! 採集數據 1、數據來源 數據來源於TX新聞,鏈接展示不了,就只貼圖了。 2、模塊 import requests import csv # Python學習 ...
  • 1. Seata Server 部署 Seata分TC、TM和RM三個角色,TC(Server端)為單獨服務端部署,TM和RM(Client端)由業務系統集成。 首先,下載最新的安裝包 也可以下載源碼,然後本地編譯。最新的版本是1.5.2 下載後的啟動包(或者源碼)中有個scripts目錄,裡面有各 ...
  • 前言 在 Java 和 Kotlin 中, 除了使用Spring Boot創建微服務外,還有很多其他的替代方案。 | 名稱 | 開發商 | | : : | : : | | Helidon SE | 甲骨文 | | Ktor | JetBrains | | Micronaut | Object Com ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...