我正在考虑将现有大型 VB6 系统的一部分转换为 .net。我正在尝试使用领域驱动设计,但我很难理解一些事情。
我完全困惑的一件事是我应该如何处理复杂的查找语句。例如,我们目前有一个屏幕显示已保存文档的列表,用户可以选择并打印、通过电子邮件发送、编辑或删除。我有一个 SavedDocument 对象,它可以完成所有操作,但它只有与其相关的属性,并且我需要显示该文档所针对的客户名称及其电子邮件地址(如果有的话)。我还需要展示该文件可能来自的政策引用。客户端和策略链接到 SavedDocument,但它们是自己的聚合根,因此不会与 SavedDocument 同时加载。
用户还可以指定多个过滤器来缩小列表。这些可以来自存储在 SavedDocument 或客户端和策略上的属性。
我不确定如何从域驱动设计的角度来处理这个问题。
- 我在存储库上是否有一个函数可以接受过滤器并向我返回 SavedDocuments 列表,然后我必须将其转换为不同的对象或 DTO,并填充其他客户端和策略信息?这看起来有点慢,因为我必须使用多次调用来加载所有详细信息。
- 存储库上是否有一个函数可以接受过滤器并返回仅包含我想要的信息的 SavedDocumentsForList 对象列表?这看起来最快,但感觉不像我在使用 DDD。
- 我是否从其对象中加载所有内容并在服务中执行所有过滤和列选择?这似乎是最慢的,但也似乎非常面向领域。
我只是真的很困惑如何处理这些情况,而且我没有真正看到任何其他人提出相关问题,这让我觉得自己错过了一些东西。
最佳答案
在 DDD 中可以通过多种方式处理查询。有时您可以使用域实体本身来提供查询服务。当查询需要多个聚合的投影时,这种方法在像您这样的场景中可能会变得很麻烦。在这种情况下,使用为相应查询显式设计的对象(有效的 DTO)会更容易。这些 DTO 将是只读的并且不会有任何行为。这可以称为read-model pattern .
关于domain-driven-design - 领域驱动设计中的复杂发现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14159526/