去年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 领域实体框架 - 领域模型设计器(建模工具)设计方案的更多相关文章

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

    Rafy 领域实体框架发布后,虽然有帮助文档,许多朋友还是反映学习起来比较复杂,希望能开发一个示例程序,展示如何使用 Rafy 领域实体框架所以,本文通过使用 Rafy 领域实体框架来改造一个传统的三 ...

  2. Rafy 领域实体框架简介

    按照最新的功能,更新了最新版的<Rafy 领域实体框架的介绍>,内容如下: 本文包含以下章节: 简介 特点 优势 简介 Rafy 领域实体框架是一个轻量级 ORM 框架. 与一般的 ORM ...

  3. Rafy 领域实体框架 - 公司内部培训视频

    本月给公司内部一个项目做架构重构,其中使用到了 Rafy 框架.所以我培训了 Rafy 领域实体框架的使用方法,过程中录制了视频,方便其他同事查看.现在把视频放到园里来分享下,有兴趣的朋友可以看看,有 ...

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

      在 Rafy 领域实体框架中,对自关联的实体结构做了特殊的处理,下面对这一功能进行讲解. 场景 在开发数据库应用程序时,往往会遇到自关联表的场景.例如,分类信息.组织架构中的部门.文件夹信息等,都 ...

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

    前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 ORM 的功能.由于在 09 年最初设计时,ORM 部分的设计并不是最重要 ...

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

    本系列演示如何使用 Rafy 领域实体框架快速转换一个传统的三层应用程序,并展示转换完成后,Rafy 带来的新功能. <福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!> ...

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

    本系列演示如何使用 Rafy 领域实体框架快速转换一个传统的三层应用程序,并展示转换完成后,Rafy 带来的新功能. <福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!> ...

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

    本文的演示需要先完成上一篇文章中的演示:<Rafy 领域实体框架示例(1) - 转换传统三层应用程序>.在完成改造传统的三层系统之后,本文将讲解使用 Rafy 实体框架后带来的一些常用功能 ...

  9. 福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!

    距离“上次框架完整发布”已经过去了一年半了,应群中的朋友要求,决定在国庆放假之际,把最新的框架发布出来,并把帮助文档整理出来,这样可以方便大家快速上手.   发布内容 注意,本次发布,只包含 Rafy ...

随机推荐

  1. iphone使用mac上的SOCKS代理

    Step 1. Make sure the SOCKS tunnel on your work computer allows LAN connections so your iPhone/iPod ...

  2. Tempdb initial size和dbcc shrinkfile

    在使用sql server时您可能遇到过下面的情况,tempdb的数据文件初始大小为3mb, 随着对tempdb的使用,tempdb文件逐渐变得很大(例如30GB),导致了磁盘空间不足. 此时您需要立 ...

  3. 自己动手写文件查找,字符串查找,查询jar包等工具

    文件查找——搜索当前目录下的文件 知道大概的文件名称,使用 findf FileName findf.py import argparse, re, os from os.path import jo ...

  4. ystep jQuery流程、步骤插件

    今天小菜给大家带来又一款给力jQuery插件:ystep. 从名称上大致可以看出,这是一个流程步骤插件. 如果无意外的话,这可能是小菜近期最后一个作品了...苦逼的小菜即将创业,可能就没时间折腾啦~好 ...

  5. ASP.NET MVC 5 - 添加一个模型

    在本节中,您将添加一些类,这些类用于管理数据库中的电影.这些类是ASP.NET MVC 应用程序中的"模型(Model)". 您将使用.NET Framework 数据访问技术En ...

  6. 《Entity Framework 6 Recipes》翻译系列(2) -----第一章 开始使用实体框架之使用介绍

    Visual Studio 我们在Windows平台上开发应用程序使用的工具主要是Visual Studio.这个集成开发环境已经演化了很多年,从一个简单的C++编辑器和编译器到一个高度集成.支持软件 ...

  7. Java集合类的总结

    Java语言的java.until包中提供了一些集合类,这些集合类又被称为容器.说到集合就会想到数组,集合类与数组的不同之处是,数组的长度是固定的,集合的长度是可变的:数组用来存放基本数据类型,集合从 ...

  8. Angularjs学习---官方phonecat实例学习angularjs step0 step1

    接下来一系列的文章都是学习https://docs.angularjs.org/tutorial的笔记,主要学习的angular-phonecat项目的实现,来介绍angularjs的使用. 1.下载 ...

  9. Leetcode-463 Island Perimeter

    #463. Island Perimeter You are given a map in form of a two-dimensional integer grid where 1 represe ...

  10. VS-默认端口导致项目不能加载的解决方案