域驱动设计中实体与聚合之间的差异

D_E*_*det 9 c# design-patterns domain-driven-design

请问域驱动设计中实体和聚合根源之间的主要区别是什么.例如,在实体框架中,如果我可以确保数据完整性实体,那么聚合的用途是什么?

Meh*_*taş 37

从域驱动设计的角度来看DbContext,UnitOfWork的实现和a DbSet<T>是存储库的实现.

这是DDD和EntityFramework对比的地方.DDD建议每个聚合根有一个存储库,但EntityFramework为每个实体创建一个.

那么,什么是聚合根?

假设我们有一个社交网络,并拥有Post,Like,Comment,Tag等实体.(我相信你可以想象这些实体之间的关系)有些实体是"聚合根"

为了找到聚合根,我试图找到哪些实体不能没有另一个实体.例如,喜欢或评论不能没有邮政.然后Post是一个聚合根,我们需要一个PostRepository或将Post实体变成一个Repository(像界面这样的着名集合).Comment和Like(以及Post)的CRUD操作应保留在此存储库中.

  • 好的答案和定义,一个更实用的定义,而不是我的理论定义。 (5认同)
  • "例如,喜欢或评论不能没有帖子"这是一种非常天真的组合聚合边界的方式.遵循这种思路将导致大型集群聚合,即使它完全没有必要.你真的需要加载在内存中发布的所有评论只是为了添加一个新的吗?这样做你想保护什么不变?您可能在某些域中需要此功能,但对于大多数博客应用程序而言,这种设计都是错误的. (5认同)
  • 'DDD建议每个聚合都有一个存储库......'这是一个优秀的,未得到充分利用的概念,恕我直言. (3认同)
  • 该答案仅标识值对象和实体。为什么 Post 是聚合根?当然,如果系统只有这三个对象。如果有作者怎么办?作者必须写这篇文章(那么没有任何作者,文章就不可能存在。)那么哪一个是聚合根呢? (3认同)
  • @plalx你是对的!这只是为了提供基本的了解。随着领域的增长,这种简单的方法将导致非常糟糕的设计,并且需要进一步分析来设计领域。但我相信,从一开始,人们就应该知道这一点。 (2认同)
  • @AlirezaRahmaniKhalili 你可以这样想。当您删除评论时,是否也删除帖子有意义?可能不会。那么这意味着帖子可以在没有评论的情况下生存。另一方面,当帖子被删除时删除评论是否有意义?可能是。那么这意味着评论不能没有帖子而存在。 (2认同)

Rez*_*abi 24

实体:主要由其身份定义的对象称为实体,它在销售系统中具有重要意义(例如客户)是一个实体,并且可以随时间变化。

值对象:值对象是仅通过其属性和值已知的对象。例如,“客户地址”可以设计为值对象。值对象可以分配给不同的实体,通常实现为不可变的(例如日期、地址)

聚合:通过聚合根对象相互关联的实体或值对象的集合

聚合根:每个聚合都有一个根和一个边界,聚合根 拥有一个聚合并作为聚合内所有修改的网关


Gre*_*reg 12

定义相当直接:

  • 聚合:基本上是一组对象,它们创建对根聚合的明确引用,因此当您引用根时,可以确保聚合的整体完整性.

聚合是域驱动设计中的一种模式.DDD聚合是一组域对象,可以视为一个单元.一个示例可能是订单及其订单项,这些订单项将是单独的对象,但将订单(及其订单项)作为单个聚合处理非常有用.

聚合将其组件对象之一作为聚合根.来自聚合外部的任何引用都应该只转到聚合根.因此,根可以确保整个聚合体的完整性.

聚合是数据存储传输的基本元素 - 您请求加载或保存整个聚合.交易不应跨越聚合边界.

DDD聚合有时会与集合类(列表,映射等)混淆.DDD聚合是域概念(订单,诊所访问,播放列表),而集合是通用的.聚合通常包含多个集合以及简单字段.术语"聚合"是常见的,并且用于各种不同的上下文(例如UML),在这种情况下,它不是指与DDD聚合相同的概念.

  • 实体:在数据模型上下文中,描述数据的结构,而不管存储的形式如何.

EDM解决了以多种形式存储数据所带来的挑战.例如,考虑将数据存储在关系数据库,文本文件,XML文件,电子表格和报告中的业务.这在数据建模,应用程序设计和数据访问方面提出了重大挑战.在设计面向数据的应用程序时,面临的挑战是编写高效且可维护的代码,而不会牺牲高效的数据访问,存储和可伸缩性.当数据具有关系结构时,数据访问,存储和可伸缩性非常高效,但编写高效且可维护的代码变得更加困难.当数据具有对象结构时,权衡取舍:编写高效且可维护的代码是以高效的数据访问,存储和可伸缩性为代价的.即使可以找到这些权衡之间的正确平衡,当数据从一种形式转移到另一种形式时也会出现新的挑战.实体数据模型通过根据独立于任何存储模式的实体和关系描述数据结构来解决这些挑战.这使得存储的数据形式与应用程序设计和开发无关.而且,由于实体和关系描述了在应用程序中使用的数据结构(而不​​是其存储的形式),它们可以随着应用程序的发展而发展.这使得存储的数据形式与应用程序设计和开发无关.而且,由于实体和关系描述了在应用程序中使用的数据结构(而不​​是其存储的形式),它们可以随着应用程序的发展而发展.这使得存储的数据形式与应用程序设计和开发无关.而且,由于实体和关系描述了在应用程序中使用的数据结构(而不​​是其存储的形式),它们可以随着应用程序的发展而发展.

定义可能有所不同,由Martin Fowler和Microsoft定义.希望这可以澄清差异.

  • 可悲的是,两者的定义可以互换使用,这可能会令人困惑,但这就是每个人的实际含义。 (3认同)