久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

使用PowerDesigner進行代碼生成

 WindySky 2008-08-20
很多代碼生成器都選擇了從表結(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)該是比較容易讀懂的:

from xml.dom import minidom import os #get config configdoc = minidom.parse('config.xml') xsdfilename = configdoc.getElementsByTagName('xsdfile')[0].attributes['name'].value namespace = configdoc.getElementsByTagName('namespace')[0].attributes['name'].value outputdirectory = configdoc.getElementsByTagName('outputdirectory')[0].attributes['name'].value # load xsd file xsddoc = minidom.parse(xsdfilename) basenode = xsddoc.childNodes[0] #create .cs file for node in basenode.childNodes: if node.nodeType == node.ELEMENT_NODE : filename = node.attributes["name"].value f = open(outputdirectory + filename + '.cs','w') f.write('using System;\n') f.write('namespace ' + namespace + '\n') f.write('{\n\t') f.write('class ' + filename + '\n') f.write('\t{\n') nodeList = node.getElementsByTagName('xsd:element') for elementNode in nodeList : name = elementNode.attributes["name"].value if elementNode.hasAttribute('type') : elementType = elementNode.attributes["type"].value f.write('\t\tprivate ' + elementType + ' _' + name + ';\n\t\t') f.write('public ' + elementType + ' ' + name + '\n\t\t{\n\t\t\t') f.write('get { return _' + name + ';}\n\t\t\t') f.write('set { _' + name + '= value;}\n') f.write('\t\t}\n') f.write('\n') f.write('\t}\n') f.write(')') f.close()

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多