Rafy 领域实体框架 - 领域模型设计器(建模工具)设计方案

去年4月,我们为 Rafy 框架添加了领域模型设计器组件。时隔一年,谨以本文,简要说明该领域模型设计器的设计思想。

 

设计目标



Rafy 实体框架中以领域驱动设计作为指导思想。所以在开发时,以领域建模为首要任务。为此,我们为它开发了领域模型设计器。开发人员可以在设计器中,设计相应的领域模型,查看现有代码对应的领域模型。

我们为这个设计器制定了以下功能:

  • 外部简单设计器:也就是设计器可以部署为一个可以独立运行的软件。该软件可以打开领域模型的设计图,方便团队中的非开发人员角色查看。同样,这个软件最好也能支持对模型进行设计。
  • Rafy 运行时设计器:Rafy 是一个插件化架构的框架。所以我们也期望这个设计器可以以插件的形式,直接运行在 Rafy 框架构建的应用程序中。这样,在应用程序运行时,就能看到当前软件对应的领域模型。
  • VS 内部设计器:这是最重要的一个功能,我们希望设计器能与 Visual Studio 深度整合。首先,这样使得可以在 Visual Studio 中就能直接进行领域建模,并能根据模型来生成实体代码;其次,在使用 CodeFirst 的场景下,也能在 Visual Studio 中直接根据当前的实体类代码来生成相应的领域模型设计图。

 

设计方案



根据当前 Rafy 框架的架构,结合要实现的设计器的功能。规划整个设计器的所需要的组件:

并画出组件间的依赖图:

 

简要说明各组件的用途:

  • DDD Object Model:位于最底层的 DDD 对象模型,用于描述领域建模中的实体及实体间的关系。这里的对象模型结构,决定了上层可支持的 DDD 建模类型。
  • Model Xml Document:用于支持对象模型的 XML 序列化。以 XML 文档的形式定义了模型的显示、实体类型、实体间的关系结构。
  • WPF Controls:WPF 中可用于显示模型的控件集。例如:实体块、连接线等。
  • WPF Model Viewer:基于 XML 文档模型,操作 WPF 控件集,实现模型的显示。
  • WPF Model Designer:同样基于 XML 文档模型,操作 WPF 控件集,实现模型的编辑。(由于编辑相对显示来说更复杂,所以设计器和查看器分为两个单独的包来实现。第一期只实现了查看器。)
  • VS Package:Visual Studio 插件包。实现模型设计器集成到 VS 中;调用同步组件,实现代码与模型间的同步。
  • Code Synchronizer:代码同步组件,实现代码与模型间的同步(Model-First 或者 Code-First)。
  • Rafy Entity Meta:当下 Rafy 框架中的实体运行时元数据包。
  • Rafy Plugin:一个可运行在 Rafy 应用程序中的插件。这个插件用于查看运行时实体的领域模型关系图。
  • Standalone Designer(exe):独立运行的设计器应用程序。

 

重点组件



下面,是重点组件的关系图。

  • DDD Object Model: 
     
  • Model WPF Controls: 
  • 文档控件结构 

 

实现细节



设计完成后,规划整个实现的顺序:

共花了半个月的时间来完成,以下是完成后的项目结构,其中选中的5个项目即是设计器相关的项目:

  • Rafy.EntityObjectModel: 对应设计中的 DDD Object Model。 
  • DesingerEngine: 对应 WPF Controls。该项目被设计为一个可重用的,与 DDD 无关,用于图形设计的程序集。 
  • Rafy.DomainModeling: 包含了设计时的 RafyDomainDocument、ModelViewer、XML Document 等组件。 
  • ModelingEnv: 一个简单的独立运行的 WPF 程序。
  • VSPackage: VS 插件。

 

初步成果



20130328 开始实现,至20130415 完成第一版本,可在 VS 中查看实体的领域模型关系图。

下面是模型查看器的效果:

以及使用独立应用程序查看的效果:

 

PS: 由于一直都使用 CodeFirst 开发模式,所以过了一年了,到现在也只是实现了模型查看,还没有实现模型设计的功能 。

最近半年没怎么长进,所以没东西可写,今天把这个翻出来,给大家做个分享。

时间: 2025-01-02 13:22:14

Rafy 领域实体框架 - 领域模型设计器(建模工具)设计方案的相关文章

Rafy 领域实体框架示例(1) - 转换传统三层应用程序

Rafy 领域实体框架发布后,虽然有帮助文档,许多朋友还是反映学习起来比较复杂,希望能开发一个示例程序,展示如何使用 Rafy 领域实体框架所以,本文通过使用 Rafy 领域实体框架来改造一个传统的三层架构应用程序--"服装进销存"系统,来讲解如何使用 Rafy 领域实体框架进行数据库应用程序的快速开发,以及替换为使用 Rafy 框架后带来的一些新功能. 完整示例包下载地址:http://pan.baidu.com/s/1AB9TL,其中包含本次改造前.改造后的源代码,以及转换说明文档

Rafy 领域实体框架演示(4) - 使用本地文件型数据库 SQLCE 绿色部署

本系列演示如何使用 Rafy 领域实体框架快速转换一个传统的三层应用程序,并展示转换完成后,Rafy 带来的新功能. <福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!> <Rafy 领域实体框架示例(1) - 转换传统三层应用程序> <Rafy 领域实体框架演示(2) - 新功能展示> <Rafy 领域实体框架演示(3) - 快速使用 C/S 架构部署>   前言 支持一款与 Access 类似的文件型数据库,对于一些绿色安装的应用程序

Rafy领域实体框架演示(4) 使用本地文件型数据库SQLCE绿色部署

前言 支持一款与 Access 类似的文件型数据库,对于一些绿色安装的应用程序来说是非常必须的.使用 Rafy 领域实体框架开发的应用程序,可以在不变更一行代码的情况下,直接由大型数据库管理系统,移植到使用简单的 SqlCE 4 文件型数据库.(关于选择使用 SQLCE 4 作为文件型数据库的原因,详见:<OEA 2.11 支持单机版数据库 - SQLite与SQLCE对比>.) 本文说明如何快速配置 Rafy 应用程序,使得不需要修改任何代码的同时,让原本支持分布式部署.连接 SqlServ

Rafy领域实体框架演示(3) 快速使用 C/S 架构部署

本系列演示如何使用 Rafy 领域实体框架快速转换一个传统的三层应用程序,并展示转换完成后,Rafy 带来的新功能. 以 Rafy 开发的应用程序,其实体.仓库.服务代码不需要做任何修改,即可同时支持单机部署.C/S 分布式部署.本文将说明如果快速使用 C/S 分布式部署. 前言 截止到上一篇,我们开发的应用程序都是采用直接连接数据库的模式: 接下来,将通过一些简单的调整,使得这个应用程序支持以 C/S 架构部署.整个过程只需要少量的代码: 包含以下步骤: 添加服务端控制台应用程序项目 修改客户

Rafy领域实体框架演示(2) 新功能展示

本文的演示需要先完成上一篇文章中的演示:<Rafy 领域实体框架示例(1) - 转换传统三层应用程序>.在完成改造传统的三层系统之后,本文将讲解使用 Rafy 实体框架后带来的一些常用功能. 数据库自动生成 在程序转换转换完毕后.由于已经配置好数据库的连接字符串,所以直接运行整个程序,Rafy 会同时生成对应的数据库.表.字段,以及相应的外键关系等. 该库满足数据库的第三范式要求.同时,开发过程中新添加的属性,也会每次自动同步到这个数据库中. 以下是服装管理系统生成的数据库结构图: 监控执行的

Rafy领域实体框架示例(1) 转换传统三层应用程序

Rafy 领域实体框架发布后,虽然有帮助文档,许多朋友还是反映学习起来比较复杂,希望能开发一个示例程序,展示如何使用 Rafy 领域实体框架所以,本文通过使用 Rafy 领域实体框架来改造一个传统的三层架构应用程序--"服装进销存"系统,来讲解如何使用 Rafy 领域实体框架进行数据库应用程序的快速开发,以及替换为使用 Rafy 框架后带来的一些新功能. 完整示例包下载地址:http://pan.baidu.com/s/1AB9TL,其中包含本次改造前.改造后的源代码,以及转换说明文档

Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成

前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 ORM 的功能.由于在 09 年最初设计时,ORM 部分的设计并不是最重要的部分,那里 Rafy 的核心是产品线工程.模型驱动开发.界面生成等.所以当时,我们简单地采用了一个开源的小型 ORM 框架:<Lite ORM Library>.这个 ORM 框架可以生成比较简单的 Sql 语句,以处理一般性的情况. 随着不断使用,我们也不断对 ORM 的源码做了不少改动,让它

Rafy 领域实体框架演示(3) - 快速使用 C/S 架构部署

本系列演示如何使用 Rafy 领域实体框架快速转换一个传统的三层应用程序,并展示转换完成后,Rafy 带来的新功能. <福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!> <Rafy 领域实体框架示例(1) - 转换传统三层应用程序> <Rafy 领域实体框架演示(2) - 新功能展示> 以 Rafy 开发的应用程序,其实体.仓库.服务代码不需要做任何修改,即可同时支持单机部署.C/S 分布式部署.本文将说明如果快速使用 C/S 分布式部署.   前

Rafy 领域实体框架 - 树型实体功能(自关联表)

在 Rafy 领域实体框架中,对自关联的实体结构做了特殊的处理,下面对这一功能进行讲解.   场景 在开发数据库应用程序时,往往会遇到自关联表的场景.例如,分类信息.组织架构中的部门.文件夹信息等,都是不限制层级的.如下图中操作系统的文件夹: 在开发这类程序时,往往是设计一张表,表中的一个可空的外键直接引用这张表本身.对应的实体如下图: 而针对这样的场景,许多ORM框架都不做默认的处理,开发者往往每次都要做重复的工作:建立类似结构的表,编写关系处理代码,编写查询代码--而这种场景经常会出现,所以