Tag: ddd repositories

DDD:用户聚合根与其他聚合中的几乎所有实体之间的一对多关系

我有以下DDD方案,分为以下聚合: 用户, 朋友(用户协会), 文件(用于用户上传), 画廊(文件分组), 消息(用户通信), 组(用户可以创建和其他成员可以加入), GroupMessages(发送给组中所有成员的消息), GroupForums(小组成员可以讨论各种主题) 这是令人困惑的地方。 用户与GroupForums之间的所有内容相关联。 通过用户存储库访问其他聚合似乎是不合逻辑的,但从级联的角度来看,如果我从技术上删除了用户,那么与用户关联的记录也应该消失。 似乎我不应该将这里存在的所有一对多关联添加到用户实体,因为从数据库中保湿似乎是荒谬的,特别是如果我尝试拉动与用户相关联的每个记录。 组织聚合和存储库的推荐策略是什么,以及处理给定实体的大量一对多关系的正确方法?

如何从存储库中检索域对象

我对存储库域对象关系有一点了解。 以下是我对域名设计所了解的一些信息(它们可能也是错误的或不准确的)。 考虑到这些,我找不到从存储库中获取域对象的方法。 在DDD中,域名应该只知道并包含业务所需的内容,其他所有内容都必须从域中清除。 没关系。 而且,从任何企业抽象数据访问也是一种很好的做法。 应用程序不需要知道我们存储数据的位置或存储数据的方式。 我们只要求存储库给我们一个域对象,它为我们提供了我们想要的对象,或者另一种方式也是有效的,我们给存储库一个域对象并将其发送到存储。 在面向对象设计中声明域对象的公共setter也是一种非常糟糕的方法,因为我们无法控制谁访问了什么并改变了什么。 因此,仅展示对象外部所需的内容是一种很好的做法。 因此,在我的脑海中,我无法找到实现我的存储库的方法。 我可以在我的代码中使用任何ORM或纯sql并检索数据。 但我无法从持久性对象创建域对象; 由于他们没有公共设置器,我无​​法创建和设置字段值。 声明包含所有字段的公共构造函数似乎不正确。 我可能有几个模型要填写,这意味着我必须定义几个具有不同参数集的构造函数。 任何帮助将不胜感激…

DDD – 如何实现高性能的搜索存储库

我有关于DDD和存储库模式的问题。 假设我有Customer聚合根的Customer存储库。 Get&Find方法返回完全填充的聚合,其中包括Address等对象。一切都很好。 但是当用户在UI中搜索客户时,我只需要聚合的“摘要” – 只是一个包含汇总信息的扁平对象。 我可以解决这个问题的一种方法是正常调用存储库中的find方法,然后在应用程序层中将每个客户聚合映射到CustomerSearchResult / CustomerInfo DTO,并将它们发送回客户端。 但我的问题是性能; 每个Customer聚合可能需要多个查询来填充所有关联。 因此,如果我的搜索条件与50个客户相匹配,那么对于可能检索数据的数据库而言,这是我非常不需要的。 另一个问题是,我可能希望包含有关客户聚合根边界之外的客户的汇总数据,例如最后订单的日期。 订单有自己的聚合,因此要获取客户的订单信息,我必须调用OrderRepository,这也会降低性能。 所以现在我觉得我有两种选择: 向CustomerRepository添加一个额外的Find方法,该方法通过执行一个有效的查询来返回这些摘要对象的列表。 创建一个专门构建的只读CustomerInfoRepository,它只有1中描述的find方法。 但这两种感觉都让我觉得我违背了DDD的原则。 我的存储库inheritance自通用基础:存储库,其中T:IAggregateRoot。 这些摘要信息对象不是聚合,并且与T的类型不同,所以#1真的违背了设计。 也许对于#2,我会创建一个没有IAggregateRoot约束的抽象SearchRepository? 我的域名中有许多类似的场景。 你会如何实现这种情况? 谢谢,戴夫 更新 在阅读Theo的答案之后,我想我会选择#2选项并在我的基础架构中创建一个专门针对这些场景的SearchRepository。 然后,应用程序层(WCF服务)可以调用这些直接填充摘要DTO的存储库,而不是将域实体映射到DTO。 ****更新2 **** 虽然我在一年前问过这个问题,但我想我只是补充一点,因为我发现了CQRS,旨在解决这个问题。 Udi Dahan( http://www.udidahan.com/ )和Greg Young( http://codebetter.com/gregyoung/ )已经写了很多关于它的文章。 如果您使用DDD创建分布式应用程序,CQRS适合您!