如何:从 UML 类图生成代码
使用 生成代码 命令,在 Visual Studio 旗舰版 可以生成从 UML 选件类关系图的代码。默认情况下,命令生成您选择的每个 UML 类型的一个 C# 类型。可以通过修改或复制生成代码的文本模板来修改和扩展此行为。可以为包含在模型中不同的包中的类型指定不同的行为。
**“生成代码”**命令特别适用于从用户所选的元素中生成代码,并适用于为每个 UML 类或其他元素生成一个文件。例如,屏幕快照显示了已从两个 UML 类生成的两个 C# 文件。
或者,如果您希望生成的代码中生成的文件与 UML 元素之间不存在一一对应的关系,则可以考虑编写使用**“转换所有模板”**命令调用的文本模板。有关此方法的更多信息,请参见如何:从 UML 模型生成文件。
有关 Visual Studio 旗舰版中 UML 类图的更多信息,请参见以下主题:
使用生成代码命令
下面的过程描述了**“生成代码”**命令的默认行为:
为每个元素生成一个单独的文件
创建一个包含类的 UML 模型。您可能希望将构造型应用于模型元素。
有关更多信息,请参见默认代码生成转换。
在类图上或在**“UML 模型资源管理器”**中,选择要从中生成代码的元素。可以选择下列项目之一:
一组特定元素。
一个包或模型,以便从其内容生成代码。
关系图,以便选择关系图上的所有元素。
打开一个所选元素的快捷菜单,然后选择 生成代码。
首次在特定模型中使用**“生成代码”**时,将出现一个对话框。使用此对话框可以编辑模型的代码生成参数。
选择 确定,除非您知道需要更改这些参数。
若要稍后返回此对话框,请打开关系图的快捷菜单,然后选择 配置默认代码生成设置 (C)。有关更多信息,请参见自定义生成代码命令。
将生成包含 C# 代码的文件。默认情况下,为每个类型生成一个文件,这些文件是在 C# 类库项目中生成的。不过,您可以自定义此行为。有关更多信息,请参见自定义生成代码命令。
将一些验证测试应用于模型以确保能将其转换为 C#。如果这些测试失败,则将显示一条错误消息,并且不执行代码生成操作。如果您创建了一个验证菜单命令,则不会为其验证命令失败的任何元素生成代码。有关更多信息,请参见如何:为 UML 模型定义验证约束。
默认代码生成转换
本节概括了**“生成代码”**命令生成的结果(除非您自定义该命令,否则该命令就会生成这些结果)。有关更多信息,请参见自定义生成代码命令。
为您在 UML 模型中选择的每个类型生成一个 C# 类型。将每个类型置于 GeneratedCode 文件夹下的一个单独的代码文件中。
如果 UML 类型包含在包中,则将生成的 C# 类型置于一个命名空间中,并在具有与命名空间相同的名称的文件夹中生成文件。
为 UML 类的每个 Attribute 生成一个 C# 属性。
为 UML 类型的每个 Operation 生成一个 C# 方法。
为类参与的每个可导航关联生成一个 C# 字段。
通过向每个 UML 类型添加一个构造型,可以控制生成的 C# 类型的更多属性。
创建此 C# 类型 |
绘制此 UML 类型 |
应用此构造型 |
---|---|---|
类 |
类 |
<none> 或 C# class |
接口 |
接口 |
<none> 或 C# interface |
Enumeration |
Enumeration |
<none> 或 C# enum |
Delegate |
类 |
C# delegate |
结构 |
类 |
C# struct |
在类型或其他元素上设置构造型
打开组件的快捷菜单在关系图上或在 UML 模型资源管理器,然后选择 属性。
在 属性 窗口中,选择在 构造型 属性的下拉箭头,选择要应用的构造型然后选中复选框。
提示 如果未出现 C# 构造型,则为模型或包含您感兴趣的模型元素的包启用 C# 配置文件。在“UML 模型资源管理器”中选择包或模型的根。然后在 属性 窗口中,选择 配置文件,然后启用 C# 配置文件。
扩展**“构造型”**属性以查看可设置的其他属性。
将类型、特性、操作和关联的**“说明”**属性写入生成的代码的 <summary> 注释中。将链接到类型的注释元素写入 <remarks> 注释。
改变生成的代码
生成的代码随每个类型、特性或操作的属性的不同而不同。例如,如果将类的**“Is Abstract”属性设置为 True,则 abstract 关键字将出现在生成的类上。如果将特性的“重数”设置为“0..*”**,则生成的属性将具有一个 IEnumerable<> 类型。
另外,每个构造型提供了多个可设置的附加属性。这些值将转换为 C# 代码中的相应关键字。例如,如果您在类上设置属性 Is Static,则 C# 类将为 static。
若要设置这些附加属性,请在关系图中选择该类或其他元素。在“属性”窗口中,展开**“构造型”,然后展开 C# 构造型(例如,“C# Class”**)。对于类,这些附加属性包括:
CLR Attributes
Is Partial
Is Static
Is Unsafe
Package Visibility
每个特性和操作还包含可设置的构造型属性。如果您未在新特性上看到属性,请运行**“生成代码”**。
自定义生成代码命令
**“生成代码”**命令的工作方式是,使用一组文本模板来转换您的模型元素。有关文本模板的更多信息,请参见代码生成和 T4 文本模板。
模板是在一组文本模板绑定中指定的。文本模板绑定指定将应用的模板、应将生成的输出放置到的位置以及**“生成代码”**命令的其他参数。
当您首次在特定模型上运行**“生成代码”**命令时,它会将一组默认模板绑定附加到模型的根。这些绑定应用于模型中的所有元素。
但是,可以通过将您自己的绑定附加到包、类或其他元素来替代和添加到这些默认绑定。绑定应用于它将附加到的元素内包含的所有元素。例如,如果您希望通过一组不同的模板来转换某个特定包内的所有类型,或将这些类型输出到其他文件夹,则可将模板绑定附加到包。
若要检查模板绑定附加到模型元素中,选择在 文本模板绑定 属性的省略号 [...] 在"属性"窗口。
**“生成代码”**命令会将模板应用与所选的每个模型元素。对于每个元素,应用的模板集是附加到其容器(直至并包括模型的根)的模板的组合集。
如果此集中的两个模板绑定都具有相同的名称,则小型容器中的绑定将替代大型容器中的绑定。例如,模型根包含名为 Class Template 的绑定。若要将您自己的模板绑定应用于特定包的内容,请定义您自己的名为 Class Template 的模板绑定。
可将多个模板应用于一个模型元素。可从每个模型元素中生成多个文件。
说明 |
---|
附加到模型的根的绑定将充当模型中所有元素的默认值。若要查看这些默认绑定值,请打开关系图的快捷菜单图面,然后选择 配置默认代码生成设置 (C)。或者,您可以选择模型的根在 UML 模型资源管理器中,然后在 文本模板绑定 属性中选择 […]。在您至少使用一次“生成代码”命令之前,绑定将不会出现。无法将模板绑定附加到关系图。 |
将文本模板绑定附加到包或其他模型元素
在 UML 模型资源管理器,打开模型元素的快捷菜单,然后选择 属性。通常,您会将文本模板绑定附加到包或模型的根。
在 属性 窗口中,选择在 文本模板绑定 属性中省略号按钮 ([…])。
**“文本模板绑定”[Text Template Bindings]**对话框将出现。
选择 添加 创建一个新的文本模板绑定。
- 或 -
选择其进行编辑现有绑定。
每个模板绑定均定义了将指定模板应用于所选模型元素以及它包含的其他模型元素的方式。
在该对话框中,设置文本模板绑定的属性。
属性
描述
名称
此绑定的名称。若要替代继承自包含包或模型的某个绑定,请使用与要替代的绑定相同的名称。
Overwrite
如果为 True,则替代任何现有代码。
Target Name
生成的文件的名称。
可将表达式插入此字符串,例如 {Name} 或 {Owner.Name}。例如,可以编写:{Owner.Name}_{Name}。在模型元素上计算表达式。它可使用元素而非方法的属性。若要查找可使用的属性,请在 Microsoft.VisualStudio.Uml.* 中查找类型的属性。
重要事项{Name} 或 {Owner.Name} 只能在“Target Name”属性中使用。若要更改生成的类的名称,您必须修改模板。有关更多信息,请参见编写文本模板。Project Path
指定将包含转换的输出文件的 Visual Studio 项目的路径。使用类型值创建新项目。选择省略号按钮 ([…]) 选择现有项目。
如果新项目不存在,则将创建它。它将是一个 C# 类库项目。
为此,您必须直接键入该项目。可以包含环境变量宏,例如 %ProgramFiles% 或 %LocalAppData%。
目标目录
在其中生成目标文件的文件夹。该路径是项目文件夹的相对路径。
可以使用 {PackageStructure} 表达式以插入与包含包的名称对应的路径。默认值为 \GeneratedCode\{PackageStructure}。还可以包含环境变量,例如 %TEMP% 或 %HomePath%。
重要事项{PackageStructure} 只能用于“目标目录”属性。模板文件路径
将执行转换的模板。
可以使用提供的模板或创建您自己的模板。可以在以下位置找到提供的模板:
…\program files\Microsoft Visual Studio 11.0\Common7\IDE\extensions\Microsoft\体系结构工具扩展性\\templates\\文本
可将所需数量的绑定附加到一个元素。
编写文本模板
可编写您自己的文本模板。文本模板可生成程序代码或任何其他类别的文本文件。
建议您首先修改标准模板的副本。可从以下位置复制模板:
…\program files\Microsoft Visual Studio 11.0\Common7\IDE\extensions\Microsoft\体系结构工具扩展性\\templates\\文本
若要了解文本模板,请参考以下主题。
文本模板是生成的文件的原型,它包含生成的文本和读取模型的程序代码。有关更多信息,请参见代码生成和 T4 文本模板。
若要在程序代码中导航 UML 模型,您必须使用 UML API。有关更多信息,请参见如何:导航 UML 模型和UML 建模扩展性的 API 参考。
若要将模板与**“生成代码”**命令一起使用,您必须包含 Modeling 指令。例如:
<#@ Modeling ElementType="Microsoft.VisualStudio.Uml.Classes.IClass" Processor="ModelingProcessor" #>
ElementType 特性定义了此模板将应用于的 UML 元素的类型。
在模板中,this 属于具有以下属性的临时类:
Element 为模板要应用于的 UML IElement。
Errors: CompilerErrorCollection
ModelBus: ModelBus.有关更多信息,请参见如何:将 UML 模型与其他模型和工具集成。
ProfileName =“C#Profile”
ServiceProvider: IServiceProvider
Session: TextTemplatingSession.
Store: Store.这是在其上实现 UML ModelStore 的可视化和建模 SDK 存储。若要获取 UML IModelStore,请使用 this.Element.GetModelStore()。
当您编写文本模板时,您可能会发现以下几点很有用。代码生成和 T4 文本模板中详细描述了此信息。
可在 Output 指令中设置结果的文件扩展名。每个文本模板中需要一个 Output 指令。
模板将自动引用某些程序集。例如,这些程序集包括 System.dll 和 Microsoft.VisualStudio.Uml.Interfaces.dll。
若要在生成的程序代码中使用其他程序集,您必须使用 Assembly 指令。例如:
<#@ Assembly Name="%ProgramFiles%\Microsoft Visual Studio 11.0\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.ArchitectureTools.Extensibility.dll" #>
一些命名空间(例如,System)会自动导入您的程序代码。对于其他命名空间,可以按使用 using 语句的方式来使用 Import 指令。例如:
<#@ Import Namespace="Microsoft.VisualStudio.Uml.Classes" #>
<#@ Import Namespace="Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml" #>
使用 Include 指令以引用其他文件的文本。
用括号 <# ... #> 括起的模板部分由**“生成代码”**命令执行。括号外部的模板部分将复制到结果文件。区分生成的代码和生成的文本很重要。生成的文本可采用任何语言。
计算 <#= Expressions #> 并将其转换为字符串。