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

时间:2015-09-02 12:57:16

标签: c# design-patterns domain-driven-design

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

3 个答案:

答案 0 :(得分:28)

从域驱动设计角度DbContext是UnitOfWork的实现,DbSet<T>是存储库的实现。

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

那么,什么是聚合根?

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

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

答案 1 :(得分:12)

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

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

聚集:通过“聚集根”对象彼此相关的实体或值对象的集合

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

答案 2 :(得分:8)

这个定义非常简单:

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

聚合是域驱动设计中的一种模式。 DDD聚合是一个   可以视为单个单元的域对象集群。一个   示例可以是订单及其订单项,这些将是分开的   对象,但处理订单(连同其行)很有用   items)作为单一聚合。

     

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

     

聚合是数据存储传输的基本要素 - 您   请求加载或保存整个聚合。交易不应该   交叉聚合边界。

     

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

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

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

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