gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:22:04 25 4
gpt4 key购买 nike

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

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

我可以处理这个问题的一种方法是像往常一样在存储库上调用 find 方法,然后在应用程序层中,将每个客户聚合映射到 CustomerSearchResult/CustomerInfo DTO,并将它们发送回客户端。

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

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

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

  1. 向 CustomerRepository 添加一个额外的 Find 方法,该方法通过执行一次高效查询返回这些摘要对象的列表。

  2. 创建一个专门构建的只读 CustomerInfoRepository,它只有 1 中描述的查找方法。

但是我觉得这两者都违背了 DDD 的原则。我的存储库继承自通用基础:Repository where 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 非常适合您!

最佳答案

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

类似于显示报告信息。如果我处理这样的事情,我不会坚持纯 DDD 方法。您建议的选项没问题,因为它可以完成您的工作。 DDD 不应被视为教条。创造性思考。放松一点 DDD。

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

我强烈推荐这个视频:Eric Evans: What I've learned about DDD since the book .如果你读过他的书,你真的应该看到整个视频。请密切注意大约 30:00 的时间,Eric Evans 自己会谈到聚合并提到您当前遇到的问题。

关于c# - DDD - 如何实现用于搜索的高性能存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2098112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com