住博客園 5 年了,以前也發過一些博文,但都在 一天后 / 幾周后 / 幾年后 將它刪了;因為感覺代碼寫得不好:不清晰或侵入太大,哪怕只有一句侵入。
可是最近重寫一套 CodeSmith 代碼生成模板的時候,發現自己編碼能力長進不少:有能力刪除大量代碼了。刪除得很順利,即使不舍;看上去這是個好事,可也是個壞事:現已難以回憶起當初為什么刪這些代碼、更回憶不起來最初為什么加這些代碼。
這些決策信息的丟失真是讓人痛心疾首。
接下來,我要實現一個好玩的東西:維護對象在內存中的引用一致性。這一次,我可不想讓那些左右決策的依據不翼而飛了;她們很珍貴:那是我的思路。
另外介紹一下上期成果吧,其實就是發個廣告啦:
很多人、包括直到前不久離職的我,都在進行着 基於數據庫且數據庫優先 的簡單應用開發。所幸的是大家都使用着相同的實現模式:Entity -(IDal、Dal)- Bll。
於是,我要寫一套 CodeSmith 模板,讓有緣人看到、使用 或 修改。
包括這套,一共編寫了三套 CodeSmith 模板;
第一套實現了基本的可用功能,第二套添加了自認為有亮點的功能,這次重構並刪除了那些自認為有亮點的功能;
所以也留下了一些心結:
- 枚舉類型的字段。雖然可讓代碼強類型、可讀性強,但使用字段注釋和類型轉換也可彌補。
- 視圖中的唯一鍵。這個關系到分頁性能,不過如果最多只返回 Top 500 之類的則也沒啥差別。
- TransactionScope。SqlServer 2000 時需要啟動 MsDtc 服務且影響性能,不過 SqlServer 2005 以上就不需要了。
-
說明
如果使用 CodeSmith 5.0,則在 CodeSmith 的 Template Explorer 的工具欄中點擊第一個按鈕(Create Template Folder Shortcut)指向 DatabaseBasedCodeGenerator 文件夾。
打開 Main.cst,編譯后在 Properties 設定必填屬性就可運行 Main.cst 了,運行后會生成完整的解決方案。
是否能編譯則還要看你的數據庫元素的命名是否重復。生成的主要是數據訪問的實現:
其中 Filter 和 Condition 是為了讓查詢條件強類型而引入的。
Condition 彌補了 Filter 中條件只能與的缺陷。
所以,Condition 蘊含的 Sql 是依靠數據庫元數據生成的,因為使用 CodeSmith,所以參考了其 SchemaExplorer 命名空間中類的命名:
下載點這里。