分享一套Code Smith 搭建N層架構模板

 開篇

日常開發時,因爲冗餘代碼過多,程序員作重複的工做過多勢必會影響開發效率。假若 對重複性代碼簡單的複製、粘貼,雖然也能節省時間,但也需仔細一步步替換,這無疑也是一件費力的事。這時咱們急需代碼生成工具,根據一套Template 快速生成咱們須要的代碼。代碼生成器原理簡單,徹底能夠開發一套適合本身的代碼生成器,一個最簡單的代碼生成器,有幾點你須要關注下:html

  1. 查詢系統視圖:INFORMATION_SCHEMA.TABLES、 INFORMATION_SCHEMA.COLUMNS  能夠得到數據庫中表、列的相關信息。
  2. 字符串的拼接:StringBuilder的使用,其AppendLine()自動換行。
  3. 將字符串寫入文本文件:File.WriteAllText()
  4. 使用了部分類(partial)
  5. 使用可空類型:因爲數據庫中表中數據頗有多是NULL,可空類型使得數據從表中讀取出來賦值給值類型更加兼容。

固然本身開發的代碼生成器侷限性很大,但對於小項目也是很好的選擇。我也寫過兩篇代碼生成器的拙文,僅供參考。程序員

提及代碼生成器,不得不說Code Smith,基於Template的編程,下面舉例的NTier架構是很基礎的,除了熟悉的三層架構,還生成了抽象工廠、緩存、單例、反射、存儲過程等,固然這個Demo只是學習用,你們能夠繼續擴展,打造本身的銅牆鐵壁。緩存

Code Smith

CodeSmith 是一種語法相似於asp.net的基於模板的代碼生成器,程序能夠自定義模板,從而減小重複編碼的勞動量,提升效率。Code Smith提供自定義Template,語法也不復雜,相似於asp.net的標識符號,<%%>、<%=%>、< script runat="template">...</script>架構

Code Smith API

N層架構-實體類模板-Entity Template

  • 首先建立一個C# template,建立指令集,導入程序集和名稱空間:
複製代碼
<%@ 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" %> 
複製代碼
  • 添加屬性Property:
複製代碼
<%--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,之後爽歪歪:)。框架

N層架構-數據訪問層接口模板,IDao Template

  • Script標籤裏能夠自定義調用的方法,屬性等。數據訪問層接口你們確定爛熟於心。
  • 經常使用的CRUD方法以及主表找子表,子表找主表。
  • Script裏面的方法,你須要熟悉一下Code Smith的API,我在上面已經貼出了經常使用的API,供你們參考。

  

N層架構-抽象工廠-AbstactFactory Template

  

N層架構-DaoSqlFactory Template

  

N層架構-數據訪問層-SqlProviderDao Template

  • 數據訪問層(DAAB)可使用微軟企業級框架 Microsoft Enterprise Library

  

N層架構-SP存儲過程-ScriptSp Template

  • 建立存儲過程以前首先須要判讀存儲過程是否存在

 

N層架構-業務邏輯層-BLLTemplate

  • 業務邏輯層上一對多,多對一須要考慮清楚,還要考慮複合主鍵這類狀況

  

N層架構-單例模式-DefaultProvieder Template

  • 單例+反射

 

N層架構-主模板-Main 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"%>
複製代碼
  • 調用Script裏面的建立模板方法

 

  

小結

上面的Ntier Tempalte不是最優化的,還有不少細節須要你考慮,好比數據類型的轉換:asp.net

 

 

就像我開篇所說那樣,工欲善其事,必先利其器,一套好的模板能夠事半功倍,我在這兒拋磚引玉,指望於君共勉,打造屬於本身的銅牆鐵壁。ide

點擊下載工具

相關文章
相關標籤/搜索