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

一、环境

        dotnet --version
        8.0.101

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


已安装组件

ComponentLink
Visual Studiohttp://go.microsoft.com/fwlink/?LinkId=185579
Visual Studio SDKhttps://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、请注意新解决方案的以下方面:

  • Dsl\DslDefinition.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) 著
                徐昊        郑晔        熊节     译

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/412893.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Blender——将模型及其所有纹理与材质导入unity

前期准备 参考视频&#xff1a;7分钟教会你如何将Blender的模型材质导入unity_哔哩哔哩_bilibili 实验模型官网下载地址&#xff1a;Hoi An Ancient House Model free VR / AR / low-poly 3D model CSDN下载链接&#xff1a; 【免费】Blender三维模型-古代房屋模型&#xff…

css实现动态水波纹效果

效果如下&#xff1a; 外层容器 (shop_wrap)&#xff1a; 设置外边距 (padding) 提供一些间距和边距 圆形容器 (TheCircle)&#xff1a; 使用相对定位 (position: relative)&#xff0c;宽度和高度均为 180px&#xff0c;形成一个圆形按钮圆角半径 (border-radius) 设置为 50%&…

Eureka 本机集群实现

距离上次发布博客已经一年多了&#xff0c;主要就是因为考研&#xff0c;没时间学习技术的内容&#xff0c;现在有时间继续完成关于代码方面的心得&#xff0c;希望跟大家分享。 今天在做一个 Eureka 的集群实现&#xff0c;我是在本电脑上跑的&#xff0c;感觉这个挺有意思&a…

网工每日一练(1月15日)

1.某计算机系统由下图所示的部件构成&#xff0c;假定每个部件的千小时可靠度为R&#xff0c;则该系统的千小时的可靠度为 ( D ) 。 2.以下IP地址中&#xff0c;属于网络 201.110.12.224/28 的主机IP是&#xff08; B &#xff09;。 A.201.110.12.224 B.201.110.12.238 C.20…

机器学习在什么场景下最常用-九五小庞

机器学习在多个场景中都有广泛的应用&#xff0c;下面是一些常见的应用场景&#xff1a; 自然语言处理&#xff08;NLP&#xff09;&#xff1a;如语音识别、自动翻译、情感分析、垃圾邮件过滤等。数据挖掘和分析&#xff1a;如市场分析、用户画像、推荐系统、欺诈检测等。智能…

代码随想录算法训练营29期|day 22 任务以及具体安排

235. 二叉搜索树的最近公共祖先 class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root null) return null;//向左遍历if(root.val > p.val && root.val > q.val){TreeNode left lowestCommonAncestor(roo…

一文极速了解【自注意力机制】

当下如火如荼的大模型&#xff0c;其中的关键技术就是注意力机制&#xff08;Attention&#xff09;&#xff0c;于2015年提出。2017年的“Attention is all you need”一文提出了Transformer模型&#xff0c;去掉RNN&#xff0c;只保留注意力&#xff0c;性能吊打所有机器翻译…

基于springboot+vue的蜗牛兼职网的设计与实现系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

我的创作纪念日-1024总结

我的创作纪念日-1024总结 1 机缘1.1 创作的初心是解决重复性问题1.2 实战项目中的经验分享1.3 日常学习中的记录1.4 其他方式的分享 2 收获3 日常4 成就5 憧憬 1 机缘 1.1 创作的初心是解决重复性问题 成为创作者的初心是因人而异的&#xff0c;但对我而言&#xff0c;它源于…

lua使用resty.http做nginx反向代理(https请求,docker容器化部署集群),一个域名多项目转发

下载使用 链接&#xff1a;https://pan.baidu.com/s/1uQ7yCzQsPWsF6xavFTpbZg 提取码&#xff1a;htay –来自百度网盘超级会员V5的分享 在根目录下执行: # 从 github 上下载文件 git clone https://github.com/ledgetech/lua-resty-http.git # 将 lua-resty-http/lib/ 下的 r…

实验一 安装和使用Oracle数据库

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

【MYSQL】存储引擎MyISAM和InnoDB

MYSQL 存储引擎 查看MySQL提供所有的存储引擎 mysql> show engines; mysql常用引擎包括&#xff1a;MYISAM、Innodb、Memory、MERGE 1、MYISAM&#xff1a;全表锁&#xff0c;拥有较高的执行速度&#xff0c;不支持事务&#xff0c;不支持外键&#xff0c;并发性能差&#x…