转载自:http://www.cnblogs.com/dahuzizyd/archive/2006/06/01/415209.html

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

 

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

 

     PowerDesigner9自己就已经具有代码生成功能,你只要建立一个Object_Oriented Model(语言选择C#,类图),完成类设计后,使用Language菜单下的“Generate C# Code”。生成完后看看代码文件,所有的属性都没有getset方法,要想生成这两个方法,就要自己动手修改PowerDesigner的代码生成模板,可以选择Language菜单下的“Edit Current Object Language”,在弹出的窗口中修改代码模板:

 

使用PowerDesigner进行代码生成(转载) 

    可以在value部分看到代码生成的脚本,如果你使用codesmith等代码生成工具写过模板,这段脚本就很容易理解了,只要自己修改下就可以了,例如,我把其中的第三行:[%visibility% ][%flags% ]%dataType% _%Code%[ = %InitialValue%];

这句改成:

private %dataType% _%Code%[ = %InitialValue%];

public %dataType% %Code%

{

       get

       {

              return _%Code%;

       }

       set

       {

              value = _%Code%;

       }

}

另外两个if分支中的也作相应的修改,再生成一次看看,getset函数都有了。

    
     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行,应该是比较容易读懂的:

使用PowerDesigner进行代码生成(转载)from xml.dom import minidom
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)
import os
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载) 
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)
#get config
使用PowerDesigner进行代码生成(转载)

使用PowerDesigner进行代码生成(转载)configdoc 
= minidom.parse('config.xml')
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载) 
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)xsdfilename 
= configdoc.getElementsByTagName('xsdfile')[0].attributes['name'].value
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)namespace 
= configdoc.getElementsByTagName('namespace')[0].attributes['name'].value
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)outputdirectory 
= configdoc.getElementsByTagName('outputdirectory')[0].attributes['name'].value
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载) 
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)
# load xsd file
使用PowerDesigner进行代码生成(转载)

使用PowerDesigner进行代码生成(转载)xsddoc 
= minidom.parse(xsdfilename)
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)basenode 
= xsddoc.childNodes[0]
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载) 
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)
#create .cs file
使用PowerDesigner进行代码生成(转载)

使用PowerDesigner进行代码生成(转载)
for node in basenode.childNodes:
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)       
if node.nodeType == node.ELEMENT_NODE :
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)              filename 
= node.attributes["name"].value
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载) 
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)              f 
= open(outputdirectory + filename + '.cs','w')
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)              f.write(
'using System;\n')
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)              f.write(
'namespace ' + namespace + '\n')
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)              f.write(
'{\n\t')
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)              f.write(
'class ' + filename + '\n')
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)              f.write(
'\t{\n')
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载) 
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)              nodeList 
= node.getElementsByTagName('xsd:element')
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)              
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)              
for elementNode in nodeList :
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载) 
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)                     name 
=  elementNode.attributes["name"].value
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)              
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)                     
if elementNode.hasAttribute('type') :
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)                            elementType 
= elementNode.attributes["type"].value
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)                            
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)                            f.write(
'\t\tprivate ' + elementType + ' _' + name + ';\n\t\t')
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)                            f.write(
'public ' + elementType + ' ' + name + '\n\t\t{\n\t\t\t')
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)                            f.write(
'get { return _' + name + ';}\n\t\t\t')
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)                            f.write(
'set { _' +  name + '= value;}\n')
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)                            f.write(
'\t\t}\n')
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)                     
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)                     f.write(
'\n')
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)              
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)              f.write(
'\t}\n')
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)              f.write(
')')
使用PowerDesigner进行代码生成(转载)
使用PowerDesigner进行代码生成(转载)              f.close()

相关文章:

  • 2021-08-22
  • 2021-11-30
  • 2022-12-23
  • 2021-12-20
  • 2021-11-18
  • 2022-12-23
  • 2022-12-23
  • 2022-02-12
猜你喜欢
  • 2021-11-23
  • 2021-12-01
  • 2021-05-04
  • 2021-12-06
相关资源
相似解决方案