是否有一个通用的DDD模式来处理域对象的欠加载

本文关键字:处理 对象 加载 模式 有一个 DDD 是否 | 更新日期: 2023-09-27 18:16:03

有时在处理应用程序时,特别是在尝试遵循适当的OOD和DDD模式时,我们最终会使用诸如Customer这样的域类。然后我们有一些存储库来加载这个对象,一切都很好,很干净。

然后应用程序变得越来越复杂,我们开始优化性能。我们经常遇到这样的情况:我们并不需要加载完整的Customer对象列表,而可能只需要加载id和名称,或者一小部分属性(例如要在网格中显示)

我经常看到的解决方案包括:
  1. 加载域对象,所以基本上我们仍然会使用Customer类,但是我们会使用单独的存储库方法来加载这些,并且该存储库方法将只从数据库加载所需的字段,并在对象中填充相应的属性。剩余的Customer字段将保持其默认值。这是一个简单的解决方案,但如果开发人员(或现有代码)期望加载某些属性,则可能导致许多错误。

  2. 目的类,我们创建类,如CustomerIdName, CustomerInfo, CustomerHeader,只包含我们需要的属性。这种方法可能会创建大量的类,但是通过小心地创建子类是可行的。似乎它带走了无处不在的领域语言的概念。

那么在DDD世界中是否有一些普遍同意的约定来处理这些?我试着谷歌一下,但找不到任何权威的东西。

或者这只是经典DDD方法的一个众所周知的局限性,而CQRS或其他方法在这些情况下会更好?

是否有一个通用的DDD模式来处理域对象的欠加载

我认为第二种方法是可行的。我们在我们的项目中这样做,但只针对只读DTO类。我想,只要你不使用它们来插入/更新,就可以了。

还有一个你可能感兴趣的答案:

这是DDD的一个众所周知的限制,而CQRS是解决这个问题的一个很好的方法。

读取端的CQRS基本上是解决方案#2,它采用了所有必要的预防措施,以避免将读取模型与可修改的域实体混淆:没有存储库,只读类等。

你看过实体框架吗?它们有多个级别的实体延迟加载:MSDN Post

我不明白为什么加载不足会成为一个问题。你知道哪些字段是无效的所以可以阻止访问/延迟加载