重写和扩展生成的类

DSL 定义是一个可以编译组强大的工具根据域特定语言 (dsl) 的平台。许多扩展和调整可以通过重写和扩展从 DSL 定义生成的类进行。这些类包括在 DSL 定义关系图中显式定义不可用的字段类,该类,还定义工具箱中,资源管理器,序列化的其他类,依此类推。

扩展性框架

提供了几种结构允许您扩展生成的代码。

Bb126289.collapse_all(zh-cn,VS.110).gif在分部类中重写的方法

分部类定义允许类在多个地方定义。这允许您从该分离代码生成的您编写的代码。在手动编写代码,可以重写生成的代码继承的类。

例如,因此,如果在 DSL 定义已经定义了一个名为 Book的域类,您可以将重写方法编写自定义代码:

public partial class Book

{

protected override void OnDeleting()

{

MessageBox.Show("Deleting book " + this.Title);

base.OnDeleting();

} }

说明说明

重写在生成的类的方法,始终编写在从生成的文件分隔的文件中的代码。通常,文件位于名为 CustomCode 的文件夹包含。如果对生成的代码进行更改,将会丢失,则在重新生成从 DSL 定义的代码。

若要查看哪些方法可以重写,在类的类型重写,由空格后面。IntelliSense 工具提示将告诉您哪些方法可被重写。

Bb126289.collapse_all(zh-cn,VS.110).gif双派生的类

大多数在生成的类的方法从内置继承设置在建模命名空间中的类。但是,有些方法在生成的代码中定义。通常,这意味着不能重写这些权限;在分部类不能重写在同一类的另一个分部定义中定义的方法。

但是,您可以通过将字段设置类的 生成派生的二进制文件 标志重写这些方法。这会导致两类生成,一个是其他的抽象基类。所有方法和属性定义在基类,因此,只有构造函数是在派生类中。

例如,在该示例 Library.dsl, CirculationBook 域类具有 GeneratesDouble Derived 属性设置为 true。该域类的生成代码包含两类:

  • CirculationBookBase,是抽象类,并包含所有方法和属性。

  • CirculationBook,从 CirculationBookBase派生。它为空,只不过其构造函数。

若要重写任何方法,请创建派生类的分部定义例如 CirculationBook。您可以重写从建模结构和方法继承的生成的方法。

可以使用元素的所有类型使用此方法,包括模型元素、关系、形状、关系图和连接线。还可以重写其他生成的类的方法。某些生成的类 (如 ToolboxHelper 总是双派生。

Bb126289.collapse_all(zh-cn,VS.110).gif自定义构造函数

不能重写构造函数。在双派生的类,该构造函数必须是在派生类中。

如果要提供拥有构造函数,则可通过将字段设置类的 Has Custom Constructor 执行此在 DSL 定义。当您单击 转换所有模板,生成的代码不会包含该类的构造函数。它将包含了对缺少构造函数。,在您生成解决方案时,这将导致错误报告。双击错误报告查看解释的生成代码的注释所应提供。

编写于生成文件的文件的分部类定义,并提供构造函数。

Bb126289.collapse_all(zh-cn,VS.110).gif标记扩展点

一个标记的扩展点是您可以设置属性或复选框指示 DSL 定义的一个位置您提供了一个自定义方法。自定义构造函数是一个示例。其他示例包括一组字段的特性的 Kind 对计算的或自定义存储或设置 是自定义的 标志在连接生成器。

在每种情况下,那么,当您将标志设置为并重新生成代码,会发生编译错误。双击错误可查看介绍的注释了必须提供。

Bb126289.collapse_all(zh-cn,VS.110).gif规则

事务管理器可以定义在一个事务结束之前运行一个指定的事件发生的事件,如属性更改的规则。规则在单元通常用于维护不同的元素之间的同相。例如,规则用于确保,关系图显示该模型的当前状态。

规则定义每个类的基类型,因此,无需安装代码来注册每个对象的规则。有关更多信息,请参见 规则在模型内部传播更改

Bb126289.collapse_all(zh-cn,VS.110).gif存储事件

建模存储提供可用于侦听更改的特定类型在存储中,包含元素的添加和删除) 的事件机制,对属性值的更改,依此类推。事件处理程序,在更改事务的关闭后。通常,这些事件用于更新在存储外的资源。

Bb126289.collapse_all(zh-cn,VS.110).gif.NET 事件

您可以订阅在形状的某些事件。例如,您可以侦听在形状的鼠标单击。必须订阅每个对象的事件编写代码。此代码在 InitializeInstanceResources() 重写进行编写。

某些事件在 ShapeFields 生成的,用于吸引形状的修饰器。有关示例,请参见如何:截获对形状或修饰器的单击

这些事件通常不在事务内发生。,如果在存储,若要使更改应创建事务。