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操作应保留在此存储库中.
Rez*_*abi 24
实体:主要由其身份定义的对象称为实体,它在销售系统中具有重要意义(例如客户)是一个实体,并且可以随时间变化。
值对象:值对象是仅通过其属性和值已知的对象。例如,“客户地址”可以设计为值对象。值对象可以分配给不同的实体,通常实现为不可变的(例如日期、地址)
聚合:通过聚合根对象相互关联的实体或值对象的集合
聚合根:每个聚合都有一个根和一个边界,聚合根 拥有一个聚合并作为聚合内所有修改的网关
Gre*_*reg 12
定义相当直接:
聚合是域驱动设计中的一种模式.DDD聚合是一组域对象,可以视为一个单元.一个示例可能是订单及其订单项,这些订单项将是单独的对象,但将订单(及其订单项)作为单个聚合处理非常有用.
聚合将其组件对象之一作为聚合根.来自聚合外部的任何引用都应该只转到聚合根.因此,根可以确保整个聚合体的完整性.
聚合是数据存储传输的基本元素 - 您请求加载或保存整个聚合.交易不应跨越聚合边界.
DDD聚合有时会与集合类(列表,映射等)混淆.DDD聚合是域概念(订单,诊所访问,播放列表),而集合是通用的.聚合通常包含多个集合以及简单字段.术语"聚合"是常见的,并且用于各种不同的上下文(例如UML),在这种情况下,它不是指与DDD聚合相同的概念.
EDM解决了以多种形式存储数据所带来的挑战.例如,考虑将数据存储在关系数据库,文本文件,XML文件,电子表格和报告中的业务.这在数据建模,应用程序设计和数据访问方面提出了重大挑战.在设计面向数据的应用程序时,面临的挑战是编写高效且可维护的代码,而不会牺牲高效的数据访问,存储和可伸缩性.当数据具有关系结构时,数据访问,存储和可伸缩性非常高效,但编写高效且可维护的代码变得更加困难.当数据具有对象结构时,权衡取舍:编写高效且可维护的代码是以高效的数据访问,存储和可伸缩性为代价的.即使可以找到这些权衡之间的正确平衡,当数据从一种形式转移到另一种形式时也会出现新的挑战.实体数据模型通过根据独立于任何存储模式的实体和关系描述数据结构来解决这些挑战.这使得存储的数据形式与应用程序设计和开发无关.而且,由于实体和关系描述了在应用程序中使用的数据结构(而不是其存储的形式),它们可以随着应用程序的发展而发展.这使得存储的数据形式与应用程序设计和开发无关.而且,由于实体和关系描述了在应用程序中使用的数据结构(而不是其存储的形式),它们可以随着应用程序的发展而发展.这使得存储的数据形式与应用程序设计和开发无关.而且,由于实体和关系描述了在应用程序中使用的数据结构(而不是其存储的形式),它们可以随着应用程序的发展而发展.
定义可能有所不同,由Martin Fowler和Microsoft定义.希望这可以澄清差异.