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 开发模式,所以过了一年了,到现在也只是实现了模型查看,还没有实现模型设计的功能 。
最近半年没怎么长进,所以没东西可写,今天把这个翻出来,给大家做个分享。
Rafy 领域实体框架 - 领域模型设计器(建模工具)设计方案的更多相关文章
- Rafy 领域实体框架示例(1) - 转换传统三层应用程序
Rafy 领域实体框架发布后,虽然有帮助文档,许多朋友还是反映学习起来比较复杂,希望能开发一个示例程序,展示如何使用 Rafy 领域实体框架所以,本文通过使用 Rafy 领域实体框架来改造一个传统的三 ...
- Rafy 领域实体框架简介
按照最新的功能,更新了最新版的<Rafy 领域实体框架的介绍>,内容如下: 本文包含以下章节: 简介 特点 优势 简介 Rafy 领域实体框架是一个轻量级 ORM 框架. 与一般的 ORM ...
- Rafy 领域实体框架 - 公司内部培训视频
本月给公司内部一个项目做架构重构,其中使用到了 Rafy 框架.所以我培训了 Rafy 领域实体框架的使用方法,过程中录制了视频,方便其他同事查看.现在把视频放到园里来分享下,有兴趣的朋友可以看看,有 ...
- Rafy 领域实体框架 - 树型实体功能(自关联表)
在 Rafy 领域实体框架中,对自关联的实体结构做了特殊的处理,下面对这一功能进行讲解. 场景 在开发数据库应用程序时,往往会遇到自关联表的场景.例如,分类信息.组织架构中的部门.文件夹信息等,都 ...
- Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 ORM 的功能.由于在 09 年最初设计时,ORM 部分的设计并不是最重要 ...
- Rafy 领域实体框架演示(4) - 使用本地文件型数据库 SQLCE 绿色部署
本系列演示如何使用 Rafy 领域实体框架快速转换一个传统的三层应用程序,并展示转换完成后,Rafy 带来的新功能. <福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!> ...
- Rafy 领域实体框架演示(3) - 快速使用 C/S 架构部署
本系列演示如何使用 Rafy 领域实体框架快速转换一个传统的三层应用程序,并展示转换完成后,Rafy 带来的新功能. <福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!> ...
- Rafy 领域实体框架演示(2) - 新功能展示
本文的演示需要先完成上一篇文章中的演示:<Rafy 领域实体框架示例(1) - 转换传统三层应用程序>.在完成改造传统的三层系统之后,本文将讲解使用 Rafy 实体框架后带来的一些常用功能 ...
- 福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!
距离“上次框架完整发布”已经过去了一年半了,应群中的朋友要求,决定在国庆放假之际,把最新的框架发布出来,并把帮助文档整理出来,这样可以方便大家快速上手. 发布内容 注意,本次发布,只包含 Rafy ...
随机推荐
- iphone使用mac上的SOCKS代理
Step 1. Make sure the SOCKS tunnel on your work computer allows LAN connections so your iPhone/iPod ...
- Tempdb initial size和dbcc shrinkfile
在使用sql server时您可能遇到过下面的情况,tempdb的数据文件初始大小为3mb, 随着对tempdb的使用,tempdb文件逐渐变得很大(例如30GB),导致了磁盘空间不足. 此时您需要立 ...
- 自己动手写文件查找,字符串查找,查询jar包等工具
文件查找——搜索当前目录下的文件 知道大概的文件名称,使用 findf FileName findf.py import argparse, re, os from os.path import jo ...
- ystep jQuery流程、步骤插件
今天小菜给大家带来又一款给力jQuery插件:ystep. 从名称上大致可以看出,这是一个流程步骤插件. 如果无意外的话,这可能是小菜近期最后一个作品了...苦逼的小菜即将创业,可能就没时间折腾啦~好 ...
- ASP.NET MVC 5 - 添加一个模型
在本节中,您将添加一些类,这些类用于管理数据库中的电影.这些类是ASP.NET MVC 应用程序中的"模型(Model)". 您将使用.NET Framework 数据访问技术En ...
- 《Entity Framework 6 Recipes》翻译系列(2) -----第一章 开始使用实体框架之使用介绍
Visual Studio 我们在Windows平台上开发应用程序使用的工具主要是Visual Studio.这个集成开发环境已经演化了很多年,从一个简单的C++编辑器和编译器到一个高度集成.支持软件 ...
- Java集合类的总结
Java语言的java.until包中提供了一些集合类,这些集合类又被称为容器.说到集合就会想到数组,集合类与数组的不同之处是,数组的长度是固定的,集合的长度是可变的:数组用来存放基本数据类型,集合从 ...
- Angularjs学习---官方phonecat实例学习angularjs step0 step1
接下来一系列的文章都是学习https://docs.angularjs.org/tutorial的笔记,主要学习的angular-phonecat项目的实现,来介绍angularjs的使用. 1.下载 ...
- Leetcode-463 Island Perimeter
#463. Island Perimeter You are given a map in form of a two-dimensional integer grid where 1 represe ...
- VS-默认端口导致项目不能加载的解决方案
