惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Microsoft Security Blog
Microsoft Security Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
V
Visual Studio Blog
宝玉的分享
宝玉的分享
IT之家
IT之家
人人都是产品经理
人人都是产品经理
T
The Blog of Author Tim Ferriss
I
InfoQ
B
Blog RSS Feed
T
Threatpost
博客园_首页
M
MIT News - Artificial intelligence
Spread Privacy
Spread Privacy
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Know Your Adversary
Know Your Adversary
U
Unit 42
Engineering at Meta
Engineering at Meta
C
Cyber Attacks, Cyber Crime and Cyber Security
月光博客
月光博客
Scott Helme
Scott Helme
T
Tor Project blog
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Last Week in AI
Last Week in AI
S
Schneier on Security
Vercel News
Vercel News
博客园 - Franky
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
L
LangChain Blog
爱范儿
爱范儿
Google DeepMind News
Google DeepMind News
The GitHub Blog
The GitHub Blog
雷峰网
雷峰网
Latest news
Latest news
C
CXSECURITY Database RSS Feed - CXSecurity.com
Hugging Face - Blog
Hugging Face - Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
S
Security Affairs
A
About on SuperTechFans
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
大猫的无限游戏
大猫的无限游戏
W
WeLiveSecurity
Cisco Talos Blog
Cisco Talos Blog
罗磊的独立博客

博客园 - lmllouk

找nopcommerce兼职人员 ArachNode.Net 之配置 CS2001 CS2008 Adobe CS4 Dreamweaver 产品许可证已过期 CSS实现网页背景渐变 jQuery 多级下拉菜单解决方案 确保已安装类型(.aspx)的应用程序 sql server 行合并 灌水 的论坛 取消svn版本控制 - lmllouk - 博客园 抓屏 - lmllouk - 博客园 fatal error C1083: Cannot open include file: 'ceconfig.h': No such file or directory PowerDesigner constraint name 长度限制问题 不同服务器数据库之间的数据操作 怎样给 ActiveX 控件签名并打包发布 温州到杭州火车 通过CertEnroll在CA上(1创建证书请求2得到证书3安装证书) orcale 常见错误 C++ BUILDER AnsiString 用法 - lmllouk
使用PowerDesigner进行代码生成(转)
lmllouk · 2009-12-30 · via 博客园 - lmllouk

转载自 http://blog.csdn.net/shanliwa/archive/2007/10/20/1834123.aspx

很多代码生成器都选择了从表结构来生成领域模型,这样的方案有一个前提,就是领域模型和数据库表结构是同构的,也就是说领域模型中的类和数据库中的记录结构十分吻合,这样数据库表结构可以简单的直接映射到领域模型。
 
    但是在业务逻辑比较复杂的情况下,对象方案和关系方案往往是不相配的,通常在两者之间有一个数据映射器来隔离两者,这时两者是相互不可见的,相互独立演变的。这样,基于表结构的代码生成领域模型的类就行不通了,而应该使用对象模型。而这样的代码生成几乎不需要自己在写代码生成器,可以使用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 (%isGenerated%) and (%isValidAttribute%)
[%comment%\n]\
[%oidDocTag%\n]\
[%customAttributes%\n]\
   .if (%Multiple% == false) and (%isIndexer% == false)
[%visibility% ][%flags% ]%dataType% %fieldCode%[ = %InitialValue%];
   .else
[%visibility% ][%flags% ]%dataType%[%arraySize%] %fieldCode%[ = %InitialValue%];
   .endif
.endif

改为:
.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"

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shanliwa/archive/2007/10/20/1834123.aspx