日常開發時,因爲冗餘代碼過多,程序員作重複的工做過多勢必會影響開發效率。假若 對重複性代碼簡單的複製、粘貼,雖然也能節省時間,但也需仔細一步步替換,這無疑也是一件費力的事。這時咱們急需代碼生成工具,根據一套Template 快速生成咱們須要的代碼。代碼生成器原理簡單,徹底能夠開發一套適合本身的代碼生成器,一個最簡單的代碼生成器,有幾點你須要關注下:html
- 查詢系統視圖:INFORMATION_SCHEMA.TABLES、 INFORMATION_SCHEMA.COLUMNS 能夠得到數據庫中表、列的相關信息。
- 字符串的拼接:StringBuilder的使用,其AppendLine()自動換行。
- 將字符串寫入文本文件:File.WriteAllText()
- 使用了部分類(partial)
- 使用可空類型:因爲數據庫中表中數據頗有多是NULL,可空類型使得數據從表中讀取出來賦值給值類型更加兼容。
固然本身開發的代碼生成器侷限性很大,但對於小項目也是很好的選擇。我也寫過兩篇代碼生成器的拙文,僅供參考。程序員
提及代碼生成器,不得不說Code Smith,基於Template的編程,下面舉例的NTier架構是很基礎的,除了熟悉的三層架構,還生成了抽象工廠、緩存、單例、反射、存儲過程等,固然這個Demo只是學習用,你們能夠繼續擴展,打造本身的銅牆鐵壁。緩存
CodeSmith 是一種語法相似於asp.net的基於模板的代碼生成器,程序能夠自定義模板,從而減小重複編碼的勞動量,提升效率。Code Smith提供自定義Template,語法也不復雜,相似於asp.net的標識符號,<%%>、<%=%>、< script runat="template">...</script>架構
<%@ CodeTemplate Inherits="CodeTemplate" Language="C#" TargetLanguage="Text" Description="NetTiers main template." Debug="True" ResponseEncoding="UTF-8"%> <%@ Assembly Name="SchemaExplorer" %> <%@ Assembly Name="System.Design" %> <%@ Assembly Name="System.DirectoryServices" %> <%@ Assembly Name="System.Web" %> <%@ Assembly Name="System.Xml" %> <%@ Import Namespace="SchemaExplorer" %> <%@ Import NameSpace="System.IO" %> <%@ Import NameSpace="System.Text" %> <%@ Import NameSpace="System.Text.RegularExpressions" %> <%@ Import NameSpace="System.Diagnostics" %> <%@ Import NameSpace="System.Xml" %> <%@ Import NameSpace="System.Xml.Xsl" %> <%@ Import NameSpace="System.Xml.XPath" %>
<%--DataSourse--%>
<%@ Property Name="CurrentTable" Type="SchemaExplorer.TableSchema" Default="" Optional="False" DeepLoad="True" Category="" Description="" OnChanged="" Editor="" EditorBase="" Serializer="" %> <%@ Property Name="RootNamespace" Default="MyOffice.Models" Type="System.String" Category="Context" Description="TargetTable that the object is based on." %>
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace <%=this.RootNamespace%>.Entity { public class <%= CurrentTable.Name%> { <% foreach(ColumnSchema col in CurrentTable.Columns) {%> public <%=col.DataType%> <%=col.Name%> {get;set;} <%}%> } }
固然生成實體類時,須要考慮可空類型,寫好一個Template,之後爽歪歪:)。框架
<%@ Import NameSpace="System.Text" %> <%@ Import NameSpace="System.Text.RegularExpressions" %> <%@ Import NameSpace="System.Diagnostics" %> <%@ Import NameSpace="System.Xml" %> <%@ Import NameSpace="System.Xml.Xsl" %> <%@ Import NameSpace="System.Xml.XPath" %>
<%@ Register Name="EntityClassTemplate" Template="Eyes.Entity.cst" MergeProperties="False" ExcludeProperties="" %> <%@ Register Name="BizClassTemplate" Template="Eyes.Biz.cst" MergeProperties="False" ExcludeProperties="" %> <%@ Register Name="IDALInterfaceTemplate" Template="Eyes.IDAL.cst" MergeProperties="False" ExcludeProperties="" %> <%@ Register Name="DALFactoryTemplate" Template="Eyes.DALFactory.cst" MergeProperties="False" ExcludeProperties="" %> <%@ Register Name="DALSqlFactoryTemplate" Template="Eyes.DALSqlFactory.cst" MergeProperties="False" ExcludeProperties="" %> <%@ Register Name="SqlSPTemplate" Template="Eyes.SqlSp.cst" MergeProperties="False" ExcludeProperties="" %> <%@ Register Name="DataProvider" Template="Eyes.Provider.cst" MergeProperties="False" ExcludeProperties="" %> <%@ Register Name="DALSqlTemplate" Template="Eyes.DALSql.cst" MergeProperties="False" ExcludeProperties="" %> <%--DataSourse--%> <%@ Property Name="ChooseSourceDatabase" Type="SchemaExplorer.DatabaseSchema" DeepLoad="True" Optional="False" Category="01. Getting Started - Required" Description="Database that the tables views, and stored procedures should be based on. IMPORTANT!!! If SourceTables and SourceViews are left blank, the Entire Database will then be generated." %>
<%--DataSourse--%>
<%@ Property Name="ChooseSourceDatabase" Type="SchemaExplorer.DatabaseSchema" DeepLoad="True" Optional="False" Category="01. Getting Started - Required" Description="Database that the tables views, and stored procedures should be based on. IMPORTANT!!! If SourceTables and SourceViews are left blank, the Entire Database will then be generated." %> <%@ Property Name="RootNamespace" Default="Net.Itcast.CN" Type="System.String" Optional="False"%>
上面的Ntier Tempalte不是最優化的,還有不少細節須要你考慮,好比數據類型的轉換:asp.net
就像我開篇所說那樣,工欲善其事,必先利其器,一套好的模板能夠事半功倍,我在這兒拋磚引玉,指望於君共勉,打造屬於本身的銅牆鐵壁。ide
點擊下載工具