是否有一个常见的DDD模式来处理域对象的欠载?

时间:2015-10-05 18:27:12

标签: c# oop domain-driven-design ddd-repositories

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

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

我经常看到的解决方案包括:

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

  2. 目的分类我们创建的CustomerIdNameCustomerInfoCustomerHeader等类只包含我们需要的属性。这种方法可以创建大量的类,但仔细的子类化是可行的。但它似乎从无处不在的领域语言概念中解脱出来。

  3. 那么在DDD世界中是否有一些普遍认同的约定来处理这些问题?我试图谷歌这个,但无法找到任何权威的。

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

4 个答案:

答案 0 :(得分:5)

我认为第二种方法是要走的路。 我们在我们的项目中这样做,但仅限于只读DTO课程。只要你没有使用它们进行插入/更新,我猜就好了。

您可能感兴趣的是answer

答案 1 :(得分:2)

这是众所周知的DDD限制,而CQRS是解决它的一种非常好的方法。

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

答案 2 :(得分:0)

您是否查看了实体框架?它们具有多个级别的实体延迟加载:MSDN Post

答案 3 :(得分:0)

我不明白为什么在装载下可能会出问题。您知道哪些字段无效,因此可以阻止访问/延迟加载