首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DDD -如何实现用于搜索的高性能存储库

DDD -如何实现用于搜索的高性能存储库
EN

Stack Overflow用户
提问于 2010-01-19 23:54:49
回答 2查看 5.9K关注 0票数 29

我有一个关于DDD和存储库模式的问题。

假设我有一个用于Customer聚合根的Customer存储库。Get & Find方法返回完全填充的聚合,其中包括Address等对象。但是当用户在UI中搜索客户时,我只需要一个聚合的“摘要”--只是一个带有汇总信息的平面对象。

处理此问题的一种方法是正常地调用存储库上的find方法,然后在应用层将每个客户聚合映射到CustomerSearchResult / CustomerInfo DTO,并将它们发送回客户端。

但我的问题是性能;每个客户聚合可能需要多个查询才能填充所有关联。因此,如果我的搜索标准匹配了50个客户,这对DB来说是一个很大的打击,因为它可能会检索我甚至不需要的数据。

另一个问题是,我可能希望包括关于客户的汇总根边界之外的客户的摘要数据,例如,上一次订单的日期。Order有自己的聚合,因此要获得客户的订单信息,我必须调用OrderRepository,这也降低了性能。

所以现在我想我还有两个选择:

  1. 向CustomerRepository添加一个额外的查找方法,该方法通过执行一个有效的查询返回这些摘要对象的列表。
  2. 创建一个构建为只读的CustomerInfoRepository,它只有1中描述的查找方法。

但这两种感觉都违背了DDD的原则。我的存储库继承了一个泛型库:存储库,其中T: IAggregateRoot。这些汇总信息对象不是聚合体,与T具有不同的类型,因此真正的#1与设计背道而驰。

也许对于#2,我会创建一个没有IAggregateRoot约束的抽象IAggregateRoot?

在我的域中有许多类似的场景。

您将如何实现此场景?

谢谢,戴夫

更新

在阅读了Theo的答案之后,我认为我将使用选项2,并在我的基础设施中创建一个专门的SearchRepository,以适应这些场景。然后,应用程序层(WCF服务)可以调用这些存储库,直接填充摘要DTO,而不是将域实体映射到DTO。

*更新2*

尽管一年多前我问过这个问题,但我想补充一下,我发现了CQRS,它的目的就是解决这个问题。Udi Dahan (http://www.udidahan.com/)和Greg (http://codebetter.com/gregyoung/)已经写了很多关于它的文章。如果您正在使用DDD创建分布式应用程序,CQRS是为您准备的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-20 00:25:05

我想你只想显示汇总的信息。这些汇总信息不是域模型的实体或值对象。它们只是信息,仅此而已。

就像显示报告信息一样。如果我处理这些事情,我就不会坚持纯粹的DDD方法。你建议的选择是可以的,因为它能让你的工作完成。DDD不应被视为教条。跳出框框思考。放松一点DDD。

但请注意,您只是在模型之外创建信息值,以显示目的。因此,如果用户选择一位信息来对其进行某种操作(这是在域模型中定义的),则需要从信息值中提取标识符并从存储库中提取实体/值对象/聚合。

我强烈推荐这个视频:艾瑞克·埃文斯:自从这本书出版以来,我对DDD的了解。如果你读了他的书,你真的应该看看整个视频。请密切关注大约30:00时,Evans自己谈论聚合,并提到您当前存在的问题。

票数 30
EN

Stack Overflow用户

发布于 2010-01-20 00:23:56

我会:

  1. 返回一个不同的对象,该对象表示我的对象的视图以供显示,例如CustomerInfo。
  2. 返回一个DataTable。通常,通用容器是最简单和最好的方法。

如果泛型库中的T是一个客户,那么我认为您错误地应用了聚合根的概念,尽管我不是一个严格的福音派。我将为客户设计一个存储库,返回任何逻辑上或舒适地与客户分组的数据,包括作为客户数据视图的DataTables或只读对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2098112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档