主頁 > 軟體工程 > 基于CodeSmith提高開發效率

基于CodeSmith提高開發效率

2023-02-09 07:54:02 軟體工程

CodeSmith簡介

 

CodeSmith 是一種基于模板的代碼生成工具,它使用類似于 ASP.NET 的語法來生成任意型別的代碼或文本,與其他許多代碼生成工具不同,CodeSmith 不要求您訂閱特定的應用程式設計或體系結構,使用 CodeSmith,可以生成包括簡單的強型別集合和完整應用程式在內的任何東西,當您生成應用程式時,您經常需要重復完成某些特定的任務,例如撰寫資料訪問代碼或者生成自定義集合,CodeSmith 在這些時候特別有用,因為您可以撰寫模板自動完成這些任務,從而不僅提高您的作業效率,而且能夠自動完成那些最為乏味的任務,CodeSmith 附帶了許多模板,包括對應于所有 .NET 集合型別的模板以及用于生成存盤程序的模板,但該工具的真正威力在于能夠創建自定義模板,

 

為什么要用代碼生成器

2代碼生成器生成代碼可以減少人為手誤書寫的bug

2可以提高代碼開發效率,簡化開發流程

2可以使輸出檔案、代碼規范化

代碼生成模板撰寫

生成模板采用asp.net的語法撰寫,語法簡單易懂,對熟悉 asp.net 開發人員很友好,即使沒有做個 asp.net 開發也可以簡單學習后進行模板撰寫,

 

1. 撰寫模板的基礎需要引入資料表,在模板中可以很簡單的引入一些生成代碼的配置項

1.<%@ CodeTemplate Language="C#" TargetLanguage="Java" Src="" Inherits="" Debug="False" Description="" ResponseEncoding="UTF-8" %>  
2.<%@ Property Name="package" Type="System.String" Default="Che168.Model" Optional="False" Category="Strings" Description="物體類命名空間" %>  
3.<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Optional="False" Category="Configs" Description="源表" %>  
4.<%@ Property Name="SourceTable2" Type="SchemaExplorer.TableSchema"  Optional="True" Category="Configs" Description="欄位備注來源表" %>  
5.<%@ Property Name="SourceTable3" Type="SchemaExplorer.TableSchema"  Optional="True" Category="Configs" Description="欄位備注來源表" %>  
6.<%@ Property Name="SourceTable4" Type="SchemaExplorer.TableSchema"  Optional="True" Category="Configs" Description="欄位備注來源表" %>
7.<%@ Property Name="IsSpringBoot" Type="System.Boolean" Category="Configs" Description="是否是SpringBoot bean,如果是,則生成api說明備注" %>

 

Name:注冊的配置的參考名稱
Description:配置項的說明
Type:為控制元件的型別,支持內置以及 .net 的型別
SchemaExplorer.TableSchema:為選擇資料源表
System.String:為文字輸入控制元件
Optional:是否可選, False為必填
IsSpringBoot:是我們選擇生成的bean是否要生成 swagger 說明
2.引入配置項之后就可以繼續撰寫代碼模板
比如生成java的bean
1.package <%=package%>import java.util.*;  
2. <%if(IsSpringBoot){ %>  
3.import io.swagger.annotations.*;  
4.<%} %>  
5.  
6./** 
7.*  <%=SourceTable.Description%>bean 
8.*/  
9.public class <%= SourceTable.Name%>  
10.{     
11.    <% foreach (ColumnSchema column in SourceTable.Columns) { %>        
12.    /**<%=  column.Description %>*/  
13.    <%if(IsSpringBoot){ %>  
14.    @ApiModelProperty(value = "<%= column.Description %>", name = "<%= column.Name.ToLower() %>")  
15.    <%} %>  
16.    <%= GetJavaType(column.DataType) %> <%= column.Name.ToLower() %> ;  
17.    <% } %>     
18.      
19.    <% foreach (ColumnSchema column in SourceTable.Columns) { %>        
20.      
21.    public void set<%=column.Name.ToLower().ToPascalName() %> (<%= GetJavaType(column.DataType) + " "+column.Name.ToLower() %> ) { this.<%= column.Name.ToLower()+" = "+ column.Name.ToLower()%>; }  
22.      
23.    public <%= GetJavaType(column.DataType) %> get<%=column.Name.ToLower().ToPascalName() %> () { return this.<%= column.Name.ToLower() %>;}  
24.    <% } %>         
25.}  
26.  
27.<script runat="template">  
28./// <summary>  
29.    /// 由DbType獲取對應的Java 的 Type  
30.    /// </summary>  
31.    /// <param name="dbtype"></param>  
32.    /// <returns></returns>  
33.    public static string GetJavaType(System.Data.DbType dbtype)  
34.    {  
35.        switch (dbtype)  
36.        {  
37.            case DbType.Int16:   
38.            case DbType.UInt16:  
39.            case DbType.Int32:   
40.            case DbType.UInt32: return "Integer";  
41.            case DbType.Int64:   
42.            case DbType.UInt64: return "long";  
43.            case DbType.Byte: return "Integer";  
44.            case DbType.Date:  
45.            case DbType.DateTime:  
46.            case DbType.DateTime2: return "Date";  
47.            case DbType.String:  
48.            case DbType.StringFixedLength:  
49.            case DbType.AnsiString:  
50.            case DbType.AnsiStringFixedLength: return "String";  
51.            case DbType.Decimal: return "BigDecimal";  
52.            case DbType.Double:   
53.            //case DbType.Currency: return "Double";  
54.            case DbType.Currency: return "BigDecimal";  
55.            default: return "String" ;  
56.        }  
57.    }  
58.</script>  

 

3. 資料型別轉換

不同的目標語言都離不開資料型別的轉換,所以我們應針對不同的目標語言書撰寫一個資料型別轉換的方法,
比如上方的資料型別轉換java型別的方法:
1.<script runat="template">  
2./// <summary>  
3.    /// 由DbType獲取對應的Java 的 Type  
4.    /// </summary>  
5.    /// <param name="dbtype"></param>  
6.    /// <returns></returns>  
7.    public static string GetJavaType(System.Data.DbType dbtype)  
8.    {  
9.        switch (dbtype)  
10.        {  
11.            case DbType.Int16:   
12.            case DbType.UInt16:  
13.            case DbType.Int32:   
14.            case DbType.UInt32: return "Integer";  
15.            case DbType.Int64:   
16.            case DbType.UInt64: return "long";  
17.            case DbType.Byte: return "Integer";  
18.            case DbType.Date:  
19.            case DbType.DateTime:  
20.            case DbType.DateTime2: return "Date";  
21.            case DbType.String:  
22.            case DbType.StringFixedLength:  
23.            case DbType.AnsiString:  
24.            case DbType.AnsiStringFixedLength: return "String";  
25.            case DbType.Decimal: return "BigDecimal";  
26.            case DbType.Double:   
27.            //case DbType.Currency: return "Double";  
28.            case DbType.Currency: return "BigDecimal";  
29.            default: return "String" ;  
30.        }  
31.    }  
32.</script>  
在模板中是可以書寫我們自定義的方法,自定義方法用<script runat="template"> 包含起來,在模板中就可以呼叫了

 

4. 如何提取公共方法

在開發中我們不可能只生成某一種型別,比如我們需要生成model,表的增刪改查陳述句,生成頁面,但是離不開的是資料型別的轉換,所以我們要把公共代碼提取到某個模板檔案,在各個模板參考這個檔案,方法如下:
新建模板檔案,將公共方法剪切到該模板檔案,包含在標簽中,在需要的模板參考該模板,如:<%@ Register Template="../Reference/Extends.cst" Name="ExtendsTools" MergeProperties="True" %>
那么我們這個檔案就可以把上方的 GetJavaType 方法洗掉掉了,
模板中也可以參考外部的 c# 代碼檔案,<%@ Assembly  Src="https://www.cnblogs.com/88223100/archive/2023/02/Reference/SqlScriptExtend.cs" %>
模板中也可以參考外部程式集 <%@ Assembly Name="CodeSmithExtend" Path="../Reference" %>  參考之后同樣可以在模板中呼叫引入的代碼方法,

書寫完模板我們編譯后,模板就可以使用了,生成代碼流程圖如下:    圖片

經驗分享

 

在實際的使用中,往往我們不只來源單表的代碼生成,于是就可以書寫支持sql,
1.首先在模板注冊兩個控制元件
2.<%@ Property Name="QuerySqlScript" Type="StringCollection" Editor="StringCollectionEditor" Category="資料源配置" Description="查詢sql" Optional="True" OnChanged="QuerySqlScriptChange" %>
3.<%@ Property Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema" Category="資料源配置" Optional="True" Description="資料來源為sql查詢時需要配置此資料庫連接,以便生成查詢列" %>
我們針對QuerySqlScript控制元件注冊改變事件QuerySqlScriptChange
在該事件中,我們使用注冊的資料源來執行我們輸入的sql,來回傳一個table結果,我們只需要關注列名稱,然后我們用正則運算式從sql中匹配出表名稱,再次分別用資料源查詢sql中涉及的表的結構,此時我們將sql中的列,從獲得的表結構中抽取出到我們宣告的一個TableTableSchema 物件中,然后我們就可以繼續在模板中使用該 TableSchema 來生成代碼,

 

總結

同樣的代碼,如采用CodeSmith代碼生成可減少 70% 的作業量,如 model的生成,表增刪改的sql腳本,基礎頁面的生成,wiki的生成,
假如標準制定好,甚至可以達到不寫一行代碼,
同時代碼生成還可以直接輸出到檔案,
  • 官網地址  https://www.codesmithtools.com/

 

作者|李丙龍

本文來自博客園,作者:古道輕風,轉載請注明原文鏈接:https://www.cnblogs.com/88223100/p/Use-CodeSmith-to-improve-development-efficiency.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/543332.html

標籤:其他

上一篇:【記錄貼】年初,我差點被領導當場開除!

下一篇:TFS2015遷移到新服務器

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more