使用PowerDesigner进行代码生成

原创 2007年10月20日 11:44:00
很多代码生成器都选择了从表结构来生成领域模型,这样的方案有一个前提,就是领域模型和数据库表结构是同构的,也就是说领域模型中的类和数据库中的记录结构十分吻合,这样数据库表结构可以简单的直接映射到领域模型。
 
    但是在业务逻辑比较复杂的情况下,对象方案和关系方案往往是不相配的,通常在两者之间有一个数据映射器来隔离两者,这时两者是相互不可见的,相互独立演变的。这样,基于表结构的代码生成领域模型的类就行不通了,而应该使用对象模型。而这样的代码生成几乎不需要自己在写代码生成器,可以使用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()
习惯了用Powerdesigner设计数据库模型,XDE设计类图。因此我一般的设计方法是用PD做分析模型,然后,用分析模型生成数据库物理模型和C#代码,再用XDE从C#代码中反向工程生成XDE模型。
但是在今天生成代码时发现一个小小的问题:在PD生成代码时,它会将实体中的attribe生成C#中的public field,而不是property,找了半天终于发现有一种方法:
在/Resource Files/Object Languages/csharp.xol文件中保存了根据模型生成代码的配置,因此,只需要修改其中Attribute项的definition项即可。或者使用lanuage-->edit current object language..功能,将 Profile/Attribute/Templates/definition改为:
.if (%isValidAttribute%)
[%comment%/n]/
[%customAttributes%/n]/
[%oid%/n]/
   .if (%multiplicity% == 1) and (%isIndexer% == false)
private    %dataType%  _%code%[ = %InitialValue%];
[%visibility% ][%flags% ]%dataType% %code%
{
   get
      {
         return _%code%;
      }
   set
      {
         _%code%=value;
      }
}
   .else
private    %dataType%[%arraySize%]  _%code%[ = %InitialValue%];
[%visibility% ][%flags% ]%dataType%[%arraySize%] %code%
{
   get
      {
         return _%code%;
      }
   set
      {
         _%code%=value;
      }
}
   .endif
.endif

(上面的代码可以做define进行简化。)



另外,今天在Flier's Sky那里找到了一个.NET Refactoring for VS.NET的破解方法,
不过那个注册表路径有问题,应该是[HKEY_LOCAL_MACHINE/SOFTWARE/.NET Refactoring/C# Refactoring Tool]
"Key"="Flier Lu"
 
 

PowerDesigner V16.5 安装文件 及 破解文件

之前在网上找个假的,只能看,不能创建自己的DB; 或者 不能破解的,比较伤脑筋。 偶在这里提供一个 可长期使用的版本。 PowerDesigner165_破解文件.rar    http://pa...
  • keenweiwei
  • keenweiwei
  • 2014年06月20日 18:00
  • 297990

CodeSmith模板(生成实体类)

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...
  • jinbiao520
  • jinbiao520
  • 2012年09月17日 20:45
  • 2361

黄聪:CodeSmith和PowerDesigner的使用安装和数据库创建(原创系列教程)

最近要忙期考,但还是决定每天抽点空来写CodeSmith的系列文章了,在此实在不敢用教程这个词语,毕竟自己对CodeSmith了解的也不是很多,有很多牛人都在博客园发布了不少关于CodeSmith的文...
  • haoxingfeng
  • haoxingfeng
  • 2014年08月27日 14:11
  • 856

powerdesigner 15 如何导出sql schema

PowerDesigner导出所有SQL脚本 操作:Database=>Generate Database PowerDesigner怎么导出建表sql脚本 1 按照数据库类型,切换...
  • u012151556
  • u012151556
  • 2015年03月17日 17:26
  • 646

PowerDesigner16.5物理数据表生成C#实体类Model

model实体类是什么: 在三层架构UI,BLL,DAL中,有时用户插入一条记录到数据库中,必然会有不少数据,按正常编程,也必然会一下子调用某个函数传入不少参数。为了减少参数的数量,达到高效简洁的效...
  • da454122373
  • da454122373
  • 2017年01月11日 18:06
  • 2428

【PD】PowerDesigner生成C#代码模板设置

http://blog.csdn.net/jerrylyj/article/details/7238226 利用powerdesigner设计类图之后,可以直接生成对应语言的代码,对于设计开...
  • CrackLibby
  • CrackLibby
  • 2015年06月25日 14:44
  • 3065

PowerDesigner OOM 生成java类(一)

PowerDesigner OOM 生成java类(一) 收藏     最近在使用PowerDesigner设计数据库,设计完cdm 和 pdm时,了解到可以用oom自动生成Java类.     但是...
  • samxx8
  • samxx8
  • 2011年03月14日 10:08
  • 10427

PowerDesigner数据结构导出工具类

第一种方式 '****************************************************************************** '* File: ...
  • fjkxyl
  • fjkxyl
  • 2017年01月13日 09:24
  • 184

根据powerdesigner的OO模型生成C#代码

习惯了用Powerdesigner设计数据库模型,XDE设计类图。因此我一般的设计方法是用PD做分析模型,然后,用分析模型生成数据库物理模型和C#代码,再用XDE从C#代码中反向工程生成XDE模型。但...
  • WNASP
  • WNASP
  • 2007年04月10日 16:00
  • 1067

使用PowerDesigner软件逆向生成C# .NET类图

为了回复广大博友,这里用PowerDesigner软件逆向生成C# .NET类图实现两步操作即可,欢迎指正和添加新意! 1.菜单Tools-》Generate new Object-...
  • skymyxvincent
  • skymyxvincent
  • 2016年11月01日 19:17
  • 1822
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用PowerDesigner进行代码生成
举报原因:
原因补充:

(最多只允许输入30个字)