很多代碼生成器都選擇了從表結(jié)構(gòu)來生成領(lǐng)域模型,,這樣的方案有一個前提,就是領(lǐng)域模型和數(shù)據(jù)庫表結(jié)構(gòu)是同構(gòu)的,,也就是說領(lǐng)域模型中的類和數(shù)據(jù)庫中的記錄結(jié)構(gòu)十分吻合,這樣數(shù)據(jù)庫表結(jié)構(gòu)可以簡單的直接映射到領(lǐng)域模型,。
但是在業(yè)務(wù)邏輯比較復雜的情況下,,對象方案和關(guān)系方案往往是不相配的,通常在兩者之間有一個數(shù)據(jù)映射器來隔離兩者,,這時兩者是相互不可見的,,相互獨立演變的。這樣,,基于表結(jié)構(gòu)的代碼生成領(lǐng)域模型的類就行不通了,,而應(yīng)該使用對象模型。而這樣的代碼生成幾乎不需要自己在寫代碼生成器,,可以使用PowerDesigner9,。 PowerDesigner9自己就已經(jīng)具有代碼生成功能,你只要建立一個Object_Oriented Model(語言選擇C#,,類圖),,完成類設(shè)計后,使用Language菜單下的“Generate C# Code”,。生成完后看看代碼文件,,所有的屬性都沒有g(shù)et和set方法,要想生成這兩個方法,,就要自己動手修改PowerDesigner的代碼生成模板,,可以選擇Language菜單下的“Edit Current Object Language”,在彈出的窗口中修改代碼模板: 可以在value部分看到代碼生成的腳本,,如果你使用codesmith等代碼生成工具寫過模板,,這段腳本就很容易理解了,只要自己修改下就可以了,,例如,,我把其中的第三行:[%visibility% ][%flags% ]%dataType% _%Code%[ = %InitialValue%]; 這句改成: private %dataType% _%Code%[ = %InitialValue%]; public %dataType% %Code% { get { return _%Code%; } set { value = _%Code%; } } 另外兩個if分支中的也作相應(yīng)的修改,再生成一次看看,,get和set函數(shù)都有了,。 C#的代碼模板是PowerDesigner的安裝目錄下的Resource Files\Object Languages目錄下的csharp.xol文件,打開后可以看到實際上是一個xml文件,這樣你就可以自己定義代碼生成的模板了,。 上面是使用PowerDesigner直接生成C#代碼,,為了通用性考慮,,首選xml,,可以給對象模型的語言選擇xml Schema,用對象模型生成一個xsd文件,,然后自己來寫一個代碼生成器,,我作了一個很簡單的例子,有興趣的朋友可以看看,。 PowerDesigner生成的xsd文件內(nèi)容: <?xml version = "1.0" ?> <xsd:schema name="ObjectOrientedModel_1.xsd" xmlns:xsd="http://www./2001/XMLSchema"> <xsd:element name="Customers"> <xsd:element name="ID" type="int"/> <xsd:element name="Name" type="string"/> <xsd:element name="Address" type="string"/> </xsd:element> <xsd:element name="Orders"> <xsd:element name="ID" type="int"/> <xsd:element name="CustomerID" type="int"/> <xsd:element name="OrderNumber" type="int"/> </xsd:element> </xsd:schema> 我又使用了一個xml文件作生成器的配置config.xml文件內(nèi)容: <?xml version="1.0" ?> <template> <xsdfile name='Z:\study\cs\ObjectOrientedModel_1.xsd'/> <outputdirectory name='z:/csfile'/> <namespace name = 'dahuzizyd'/> </template> 我機器上的開發(fā)環(huán)境和VS.net有沖突,,只好用python寫了一個,但是只有不到50行,,應(yīng)該是比較容易讀懂的:
|
|