CodeSmith终极玩法
CodeSmith是一個模仿asp.net運行機制的代碼生成器,? 運行時分析模板(相當aspx文件)的預編譯指令和主體內容, 生成一個繼承自CodeSmith.Engine.CodeTemplate(相當于System.Web.UI.Page)或者一個在Inherites預編譯指令指定的類(相當于CodeBehind類)的源碼, 且把它編譯. 然后把這個類綁定到一個PropertyGrid, 讓用戶編輯參數后執行生成類的__RenderMethod1(相當于Render)方法生成最終代碼. 這種模式很好的把易變的生成內容和相對穩定的用于的生成代碼的數據源隔離開來.
我認識的大多數CodeSmith用戶都是根據數據庫結構去生成實體類, 存儲過程或者asp.net的界面, 而CodeSmith本身提供了SchemaExplorer用于讀取數據庫結構, 在模板的預編譯指令聲明類型為SchemaExplorer.TableSchema的屬性即可使用. 而大多數模板都是利用SchemaExplorer去獲得數據庫結構.
PropertyGrid是用戶和根據模板生成的類之間互動的橋梁, 通過在屬性或者屬性所屬類型上標記EditorAttribute可以任意擴展該屬性在PropertyGrid里的表現形式, 詳細情況請參考http://www.microsoft.com/china/msdn/archives/library/dndotnet/html/usingpropgrid.asp
然而CodeSmith并不支持在模板里定義的屬性標記Attribute, 即使有, 在CodeSmithStudio里寫這么復雜的代碼也不方便. 解決方法就是自己在vs.net寫一個模板的基類(必須從CodeSmith.Engine.CodeTemplate繼承), 然后通過指定Inherites關鍵字讓模板從基類繼承, 這時就可以利用EditorAttribute為所欲為了. 我做了一個可以用來生成多個nhibernate實體類, xml映射和aspx界面的模板基類, 還可以把填寫的內容序列化到xml文件和從xml文件反序列化. 我并沒有用TableSchema去做生成代碼的數據源, 而是有自定義的數據結構, 并且可以手工用XtraGrid去編輯, 當然也可以利用SchemaExplorer去從數據庫取結構. 這個基類的結構如下:?????????????
| ◆-------> 0????????* |
| ◆-------> 0??????? * |
|
ClassGenerator還有3個特殊屬性SelectedClasses, Save, Load. 它們沒有任何意義, 只是利用它們標記的EditorAttribute執行用SchemaExplorer一次選擇多個表, 把編輯的內容保存成xml和從xml加載的功能
源碼及模板
btw: 我用XtraGrid時遇到問題, 刪除一列時被選中列就會往后跳一條, 結果就是刪到倒數第二條時會出現索引超出范圍的錯誤, 誰知道怎么解決?
轉載于:https://www.cnblogs.com/Yok/archive/2005/06/23/179938.html
總結
以上是生活随笔為你收集整理的CodeSmith终极玩法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Maven环境搭配及继承
- 下一篇: 中文命名代码示例之Spring Boot