计算的和自定义的存储属性

在域特定语言 (dsl) 的所有 (DSL)字段的特性显示给用户的关系图和语言资源管理器的,并可由程序代码访问。 但是,属性不同方式与存储它们的值。

类型字段的特性

在 DSL 定义,可以如下表所列设置字段的特性的 kind ,例如:

字段的特性类型

说明

标准 (默认值)

在 存储区 中保存和序列化为文件的字段的特性。

计算

不在存储区保存的只读字段的特性,但是,从其他值计算。

例如, Person.Age 可以从 Person.BirthDate计算。

您必须提供一个执行计算的代码。 通常,您将计算从其他字段的特性的值。 但是,也可以使用外部资源。

自定义存储

不直接在存储区保存的字段,属性,但可以获取和设置。

您必须提供获取和设置值的方法。

例如, Person.FullAddress 在 Person.StreetAddress、 Person.City和 Person.PostalCode可以存储。

您还可以访问外部资源,例如获取和设置从数据库的值。

,当 Store.InUndoRedoOrRollback 为 true 时,代码不应将值存储在。 事务和自定义 setter参见。

提供代码为一个计算的或自定义存储属性

如果设置了字段特性设置为计算的或自定义存储,必须提供访问方法。 当您生成解决方案时,错误报告将告知您需要什么。

定义一个计算的或自定义存储属性

  1. 在 DslDefinition.dsl,选择字段的特性在关系图上或在 DSL 资源管理器

  2. 属性 窗口中,将 kind 字段设置为 计算自定义存储

    确保也将其 类型 到您想要的。

  3. 解决方案资源管理器工具栏上单击 转换所有模板

  4. 在**“生成”菜单上,单击“生成解决方案”**。

    收到以下错误消息:“TheClass 不包含获取属性的定义”。

  5. 双击错误消息。

    DSL \GeneratedCode\DomainClasses.cs or DomainRelationships .cs 打开。 在所公开的方法中调用,注释提示您输入的访问属性提供实现 ()。

    备注

    此文件是从 DslDefinition.dsl 生成。如果您编辑此文件,请单击 转换所有模板的更改将在下次丢失。另外,请将在单独的文件中所需的方法。

  6. 创建或打开在单独的文件夹,例如 CustomCode \TheDomainClass.cs 的类文件。

    确保命名空间与生成的代码方面。

  7. 在类文件中,编写字段类的部分实现。 在类中,编写类似于下面的示例中缺少 获取 方法的定义:

    namespace Company.FamilyTree
    {  public partial class Person
       {  int GetAgeValue()
          { return System.DateTime.Today.Year - this.BirthYear; }
    }  }
    
  8. 如果设置 kind自定义存储,还必须提供 设置 方法。 例如:

          void SetAgeValue(int value)
          { if (!Store.InUndoRedoOrRollback)
              this.BirthYear = 
                  System.DateTime.Today.Year - value; }
    

    ,当 Store.InUndoRedoOrRollback 为 true 时,代码不应将值存储在。 事务和自定义 setter参见。

  9. 生成并运行解决方案。

  10. 测试属性。 确保您尝试 取消重做

事务和自定义 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);
}

有关事务的更多信息,请参见在程序代码中导航和更新模型

请参见

参考

域属性的属性

概念

在程序代码中导航和更新模型

如何定义域特定语言