使用PowerDesigner进行代码生成

很多代码生成器都选择了从表结构来生成领域模型,这样的方案有一个前提,就是领域模型和数据库表结构是同构的,也就是说领域模型中的类和数据库中的记录结构十分吻合,这样数据库表结构可以简单的直接映射到领域模型。

    但是在业务逻辑比较复杂的情况下,对象方案和关系方案往往是不相配的,通常在两者之间有一个数据映射器来隔离两者,这时两者是相互不可见的,相互独立演变的。这样,基于表结构的代码生成领域模型的类就行不通了,而应该使用对象模型。而这样的代码生成几乎不需要自己在写代码生成器,可以使用PowerDesigner9。

    PowerDesigner9自己就已经具有代码生成功能,你只要建立一个Object_Oriented Model(语言选择C#,类图),完成类设计后,使用Language菜单下的“Generate C# Code”。生成完后看看代码文件,所有的属性都没有get和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分支中的也作相应的修改,再生成一次看看,get和set函数都有了。

C#的代码模板是PowerDesigner的安装目录下的Resource Files/Object Languages目录下的csharp.xol文件,打开后可以看到实际上是一个xml文件,这样你就可以自己定义代码生成的模板了。

上面是使用PowerDesigner直接生成C#代码,为了通用性考虑,首选xml,可以给对象模型的语言选择xml Schema,用对象模型生成一个xsd文件,然后自己来写一个代码生成器,我作了一个很简单的例子,有兴趣的朋友可以看看。

PowerDesigner生成的xsd文件内容:

<?xml version = "1.0" ?>

<xsd:schema name="ObjectOrientedModel_1.xsd" xmlns:xsd="http://www.w3.org/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文件内容:

<?xml version="1.0" ?>

<template>

<xsdfile name='Z:/study/cs/ObjectOrientedModel_1.xsd'/>

<outputdirectory name='z:/csfile'/>

<namespace name = 'dahuzizyd'/>

</template>

我机器上的开发环境和VS.net有冲突,只好用python写了一个,但是只有不到50行,应该是比较容易读懂的:

 
 
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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值