计算的和自定义的存储属性
在域特定语言 (dsl) 的所有 (DSL)字段的特性显示给用户的关系图和语言资源管理器的,并可由程序代码访问。 但是,属性不同方式与存储它们的值。
类型字段的特性
在 DSL 定义,可以如下表所列设置字段的特性的 kind ,例如:
字段的特性类型 |
说明 |
---|---|
标准 (默认值) |
在 存储区 中保存和序列化为文件的字段的特性。 |
计算 |
不在存储区保存的只读字段的特性,但是,从其他值计算。 例如, Person.Age 可以从 Person.BirthDate计算。 您必须提供一个执行计算的代码。 通常,您将计算从其他字段的特性的值。 但是,也可以使用外部资源。 |
自定义存储 |
不直接在存储区保存的字段,属性,但可以获取和设置。 您必须提供获取和设置值的方法。 例如, Person.FullAddress 在 Person.StreetAddress、 Person.City和 Person.PostalCode可以存储。 您还可以访问外部资源,例如获取和设置从数据库的值。 ,当 Store.InUndoRedoOrRollback 为 true 时,代码不应将值存储在。 事务和自定义 setter参见。 |
提供代码为一个计算的或自定义存储属性
如果设置了字段特性设置为计算的或自定义存储,必须提供访问方法。 当您生成解决方案时,错误报告将告知您需要什么。
定义一个计算的或自定义存储属性
在 DslDefinition.dsl,选择字段的特性在关系图上或在 DSL 资源管理器。
在 属性 窗口中,将 kind 字段设置为 计算 或 自定义存储。
确保也将其 类型 到您想要的。
在 解决方案资源管理器工具栏上单击 转换所有模板 。
在**“生成”菜单上,单击“生成解决方案”**。
收到以下错误消息:“TheClass 不包含获取属性的定义”。
双击错误消息。
DSL \GeneratedCode\DomainClasses.cs or DomainRelationships .cs 打开。 在所公开的方法中调用,注释提示您输入的访问属性提供实现 ()。
备注
此文件是从 DslDefinition.dsl 生成。如果您编辑此文件,请单击 转换所有模板的更改将在下次丢失。另外,请将在单独的文件中所需的方法。
创建或打开在单独的文件夹,例如 CustomCode \TheDomainClass.cs 的类文件。
确保命名空间与生成的代码方面。
在类文件中,编写字段类的部分实现。 在类中,编写类似于下面的示例中缺少 获取 方法的定义:
namespace Company.FamilyTree { public partial class Person { int GetAgeValue() { return System.DateTime.Today.Year - this.BirthYear; } } }
如果设置 kind 到 自定义存储,还必须提供 设置 方法。 例如:
void SetAgeValue(int value) { if (!Store.InUndoRedoOrRollback) this.BirthYear = System.DateTime.Today.Year - value; }
,当 Store.InUndoRedoOrRollback 为 true 时,代码不应将值存储在。 事务和自定义 setter参见。
生成并运行解决方案。
测试属性。 确保您尝试 取消 和 重做。
事务和自定义 setter
在自定义存储属性设置方法,因为方法通常对一个活动事务内,因此,不必打开事务。
但是,这个 set 方法也可以调用,如果用户调用撤消或重做操作,或者,如果事务回滚。 当 InUndoRedoOrRollback 为 true 时,安装的方法应具有如下行为:
它不应更改在单元,例如赋值给其他字段的特性。 取消管理器将设置其值。
但是,它应更新任何在存储外的外部资源,例如数据库或文件目录或对象。 这,以确保它们在与值一起同相将保留在存储。
例如:
void SetAgeValue(int value)
{
// If we are in Undo, no changes to Store objects:
if (!this.Store.InUndoRedoOrRollback)
{
this.BirthYear = System.DateTime.Today.Year - value;
}
// But always update external objects:
System.IO.File.WriteAllText(AgeFile, value);
}
有关事务的更多信息,请参见在程序代码中导航和更新模型。