领域特定语言(Domain-Specific Language, DSL)在 Visual Studio 2022中的实验——建立领域模型

一、环境

        dotnet --version
        8.0.101

        Microsoft Visual Studio Enterprise 2022 (64 位) - Current
        版本 17.8.4

已安装组件

Component Link
Visual Studio http://go.microsoft.com/fwlink/?LinkId=185579
Visual Studio SDK https://go.microsoft.com/fwlink/?linkid=2166172
Modeling SDK for Visual Studio

二、概述

        域特定语言(Domain-Specific Language,DSL)是一种表示法,通常用图表示,其表示方法与UML中的类图相近,旨在用于特定目的。

        相比之下,UML 等语言是通用的。 在 DSL 中,可以定义模型元素的类型及其关系,以及它们在屏幕上的呈现方式。

        在VS2022中设计 DSL 后,可以将其作为 Visual Studio 集成扩展 (VSIX) 包的一部分进行分发。表示法只是 DSL 的一部分。 VSIX 包与表示法一起包含一些工具,用户可以应用这些工具来帮助他们编辑和生成模型中的材料。

        DSL 的主要应用之一是生成程序代码、配置文件和其他工件。 尤其是在将创建产品的多个变体的大型项目和产品系列中,从 DSL 生成许多可变方面可以明显提高可靠性,并快速响应需求变化。

三、创建DSL项目解决方案

        若要创建新的域特定语言,请使用域特定语言项目模板创建新的 Visual Studio 解决方案。

  1. 在 “文件” 菜单上,指向 “新建” ,再单击 “项目” 。

  2. 在“创建新项目”下查找“特定于域的语言设计器”。

  3. 单击“特定于域的语言设计器”。

  4. 在“名称”框中,键入 FamilyTree。 单击 “创建” 。

  5. 对于本次实验,选择“最小语言”模板。

  6. 在相应的向导页中输入 DSL 的文件扩展名。 这是包含 DSL 的实例的文件将使用的扩展名。

  7. 检查其他页面,然后单击“完成”。

    将生成包含两个项目的解决方案。 它们名为 Dsl 和 DslPackage。 随即打开名为 DslDefinition.dsl 的关系图文件。

四、建立模型

1、请注意新解决方案的以下方面:

  • DslDslDefinition.dsl 这是创建 DSL 解决方案时看到的文件。 解决方案中的几乎所有代码都是从此文件生成的,对 DSL 定义进行的大多数更改都在此处进行。 有关详细信息,请参阅使用 DSL 定义关系图。

  • Dsl 项目 此项目包含定义域特定语言的代码。

  • DslPackage 项目 此项目包含允许 DSL 实例在 Visual Studio 中打开和编辑的代码。

2、重命名域类、关系和工具

在 DslDefinition 关系图中,将 ExampleModel 重命名为 FamilyTreeModel,将 ExampleElement 重命名为 Person,将 Targets 重命名为 Parents,将 Sources 重命名为 Children。 可以单击每个标签进行更改。使其如下图所示

3、重命名元素和连接器工具

        单击“解决方案资源管理器”下的选项卡,打开“DSL 资源管理器”窗口。 如果看不到该窗口,则在“视图”菜单上,指向“其他窗口”,然后单击“DSL 资源管理器” 。 DSL 资源管理器仅在 DSL 定义关系图为活动窗口时可见。

        打开“属性”窗口并定位它,以便可以同时查看 DSL 资源管理器和属性。

        在 DSL 资源管理器中,依次展开“编辑器”、“工具箱选项卡”、“<你的 DSL>”和“工具”。

        单击 ExampleElement。 这是用于创建元素的工具箱项。

        在“属性”窗口中,将“Name”属性更改为“Person” 。

        请注意,Caption 属性也会更改。

        同样,将 ExampleConnector 工具的名称更改为 ParentLink。 更改 Caption 属性,不将其作为 Name 属性的副本。 例如,输入“父链接”。

4、将域属性添加到类

        在 DSL 定义关系图中,右键单击 Person 域类,指向“添加”,然后单击“域属性”。

        键入新属性名称的列表,例如 Birth 和 Death。 在键入每个名称后按 Enter。

        添加将在形状中显示属性的修饰器。

        沿着从 Person 域类扩展到关系图另一侧的灰色线。 这是关系图元素映射。 它将域类链接到形状类。

        右键单击此形状类,指向“添加”,然后单击“文本修饰器” 。

        添加两个名称为 BirthDecorator 和 DeathDecorator 的修饰器。

        选择每个新修饰器,然后在“属性”窗口中设置“位置”字段。 这决定了域属性值将在形状上显示的位置。 例如,设置 InnerBottomLeft 和 InnerBottomRight。

五、设置关系图

        也可以添加域类,将模型改成如图所示

 可以在“关系图元素”中设置域类-几何图形的映射,同时可以设置域类属性和修饰器之间的映射

六、测试

  1. 在“解决方案资源管理器”的工具栏中,单击“转换所有模板”

  2. 按 F5。 等到 Visual Studio 的实验实例出现。

可以在实例实例的工具箱中看到领域模型的域类和关联关系已经出具在工具列表中了,现在新建的领域模型可以集成在VS2022的开发工具中,用于开发其他相关应用了。

利用领域模型提供的工具,可以创建新的应用模型了。

七、参考文章

1、域特定语言入门 - Visual Studio (Windows) | Microsoft Learn

2、领域特定语言
      Domain-Specific Language
        【美】马丁.福勒(Martin Fowler) 著
                徐昊        郑晔        熊节     译