0.引言

在现有的系统开发中,大部分的系统应该都会用到ORM,无论用的是EF还是NHibernate。作为对象和持久化数据的桥梁,ORM确实非常方便,以至于在DDD的时候,我们很自然的将 ORM中的Model(实体)表达成DDD中的 DomainModel(领域对象)。

但这真的合理吗?我们先引入两个例子来探讨这个问题。

1.例子1:订单聚合

下述聚合引自汤神的博客:

我们看以上的聚合设计非常经典。Order对象作为聚合根,OrderItem建模成实体,只要在当前的订单聚合中不重复即可。

但在真正的数据存储的时候,我们的OrderItem对象肯定不能是这样子的。

假如:我们有两个订单A和B,订单A包含了商品1和商品2,订单2包含商品2和商品3。

那么很明显我们如果以OrderItem这个实体去存储,必然会造成主键重复。在实际存储的时候我们肯定也会为OrderItem增加其他的字段用来存储他自己的主键信息。

比如我们给他建立一个独立的ID:

 public class OrderItem{/// <summary>/// 订单项ID/// </summary>public string Id { get; set; }public string ProductId { get; set; }public string ProductName { get; set; }public float Price { get; set; }public int Count { get; set; }}

或则采用联合主键:

    public class OrderItem{/// <summary>/// 订单ID/// </summary>public string OrderId { get; set; }public string ProductId { get; set; }public string ProductName { get; set; }public float Price { get; set; }public int Count { get; set; }}

2.例子2:旅馆聚合与房间聚合

在旅馆信息系统管理里面,对旅馆的操作会有独立的模块,参考聚合的设计原则

  1. 如果领域内的一个对象,我们会在后台有一个独立的模块去管理它,那它基本上也是聚合根了;

所以我们建立旅馆聚合,代码如下:

    public class Hotel{/// <summary>/// 聚合跟id/// </summary>public string Id { get; set; }/// <summary>/// 值对象/// </summary>public string Name { get; set; }/// <summary>/// 房间列表 此处简单标示        /// </summary>public IList<string> Rooms { get; set; }//其他信息略//...}

对于旅馆房间的也一样我们会有单独的模块去管理,而且房间有单独的状态标示(房间是否有人入住,是否空房等等)

房间聚合如下:

  public class Room{/// <summary>/// 房间id/// </summary>public string Id { get; set; }public string Name { get; set; }public string RoomType { get; set; }// 空 已预订,已入住,脏房间等状态public RoomStatus Status { get; set; }/// <summary>/// 旅馆聚合根ID/// </summary>public string HotelId { get; set; }}

如果是在ORM中上述很可能表达成如下实体:

    public class Hotel{public string Id { get; set; }public string Name { get; set; }/// <summary>/// 房间列表    /// </summary>public virtual IList<Room> Rooms { get; set; }//其他信息略//...}

和房间实体

 public class Room{/// <summary>/// 房间id/// </summary>public string Id { get; set; }public string Name { get; set; }public string RoomType { get; set; }// 空 已预订,已入住,脏房间等状态public RoomStatus Status { get; set; }/// <summary>/// 旅馆/// </summary>public virtual Hotel Hotel { get; set; }}

很明显的可以看出,上述模型不是DDD中的领域对象模型。

3.结论:ORM中的Model不应该与DDD中的DomainModel等价

更多的:我们在设计数据库表的时候,为了查询性能考虑,会冗余一些信息等等。

通过以上的分析,我们可以得出结论:ORM中的Model不应该与DDD中的DomainModel等价。

我藉著本文来抛砖引玉。

国外的大牛写的:Just-Stop-It!-The-Domain-Model-Is-Not-The-Persistence-Model.aspx

转载于:https://www.cnblogs.com/zhengqzheng/p/5883612.html

ORM中的Model与DDD中的DomainModel相关推荐

  1. 深入理解DDD中的聚合

    本文来说下领域驱动设计中的聚合 文章目录 概述 聚合解决的核心问题是什么 聚合划分的原则 生命周期一致性 问题域一致性 场景频率一致性 尽量小的聚合 实现方面的考虑 资源库.工厂面向聚合定义 代码结构 ...

  2. Django中的Model(字段) - 第五轻柔的code - 博客园

    Django中的Model(字段) - 第五轻柔的code - 博客园 Django ORM 中的批量操作 - AlphaJx - 博客园

  3. java eav_entity-framework-4 – 实体框架4和ddd中的EAV

    我的数据库中的一些表是使用EAV概念设计的. 然后我使用自动生成的实体,并将ORM实体框架的"静态"表(不是"EAV"表)表示为DDD对象. >如何使用E ...

  4. DDD 中的几个困难问题

    领域到底是什么? 对领域这个词的理解就是 DDD 入门的第一个难关.我们有时会被客户问到,领域到底是什么?首先要清晰地知道领域是什么,才能划分核心域.支撑域和通用域.换句话说,构成领域的要素是什么呢? ...

  5. MVC 中的Model对象

    创建--前台表单数据提交到Controller @model MVC_plug.Models.Students@{ViewBag.Title = "Create"; }<h2 ...

  6. java中的model_Java程序员必看之springmvc中的Model对象在重定向中的数据

    原标题:Java程序员必看之springmvc中的Model对象在重定向中的数据 在springmvc框架中,一个handler方法中的参数可以内置接收Model类型的对象,主要用于存储数据之用,主要 ...

  7. DDD中的聚合和UML中的聚合以及组合的关系

    UML: 聚合关系:成员对象是整体的一部分,但是成员对象可以脱离整体对象独立存在. 如汽车(Car)与引擎(Engine).轮胎(Wheel).车灯(Light)之间的关系为聚合关系,引擎.轮胎.车灯 ...

  8. 【18】ASP.NET Core MVC 中的 Model介绍

    ASP.NET Core MVC 中的 Model 在本视频中,我们将通过一个示例讨论 ASP.NET Core MVC 中的 Model. 我们希望最终从 Student 数据库表中查询特定的学生详 ...

  9. 关于DDD中Domain的思考

    2019独角兽企业重金招聘Python工程师标准>>> 本文既不推销UML,也不推广DDD,更不涉及各种论战.-- 作者 某天又一次打开关于DDD(领域驱动设计)的PDF文档时,自己 ...

最新文章

  1. 利用c语言结构体和union实现类似c++的public,private的实现
  2. 10、计算机图形学——几何介绍(曲面的分类以及示例)
  3. Linux常用的基本命令01
  4. 信息收集工具exiftool获取图片中的exif信息
  5. Tableau实战系列浏览 Tableau 环境(六) -工作簿和工作表
  6. Node工程-构建优秀的Session机制
  7. iptables复习记忆
  8. 数据结构---排序算法的总结
  9. 排序上---(排序概念,常见排序算法,直接插入,希尔排序,直接选择排序,堆排序)
  10. 弄了一个数学论坛,感觉不错,欢迎加入讨论
  11. POJ 2828 Buy Tickets(单点更新) 详细题解和思路
  12. matplotlib如何绘制两点间连线_python matplotlib 如何画点 而不要画点之间的连线?...
  13. 机器学习中梯度下降算法的实际应用和技巧/李文哲
  14. 基于FPGA的电梯控制器设计(任意楼层)
  15. RadAsm模板修改
  16. java生成随机数方法
  17. 阿里云centos服务器安装图形化桌面并启动
  18. adb通过局域网连接手机
  19. Python趣味绘图,一闪一闪亮晶晶,满天都是小星星
  20. 好好上个网不容易:2016上半年网络安全事件盘点

热门文章

  1. 计算机统考测试,计算机统考专业测试题.doc
  2. matlab大作业题题单,2011MATLAB大作业-题目-
  3. ehchache验证缓存过期的api_Ehcache缓存配置
  4. .Net开发WebApi如何使用JObject对象接收参数
  5. java递归统计一个文件夹含子文件夹里文件不同后缀的出现次数
  6. Java 代码性能优化
  7. Python数据预处理之异常值的处理——【自定义的three_sigma()函数、boxplot()方法】
  8. C++ STL 线性容器的用法
  9. leetcode43. 字符串相乘 经典大数+和*
  10. 栈/队列 互相模拟实现