请问域驱动设计中实体和聚合根之间的主要区别是什么。例如,在实体框架中,如果我可以确保数据完整性实体,那么聚合的用途是什么?
答案 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定义。希望这可以澄清差异。