有时在处理应用程序时,特别是在尝试遵循正确的OOD和DDD模式时,我们最终会使用Customer
等域类。然后我们有一些将加载这个对象的存储库,一切都很好而且干净。
然后应用程序变得越来越复杂,我们开始优化性能。我们经常发现自己处于这样的情况,我们并不真正需要加载完整的Customer
对象列表,但可能只是ID和名称,或者是一小部分属性(例如在网格中显示) )
我经常看到的解决方案包括:
欠载域对象,所以基本上我们仍然会使用Customer
类,但我们会使用单独的存储库方法来加载这些,并且该存储库方法将从数据库只需要字段,并填充对象中的相应属性。剩余的Customer
字段将保持默认值。这是一个简单的解决方案,但如果开发人员(或现有代码)希望加载某些属性,则会导致许多错误。
目的分类我们创建的CustomerIdName
,CustomerInfo
,CustomerHeader
等类只包含我们需要的属性。这种方法可以创建大量的类,但仔细的子类化是可行的。但它似乎从无处不在的领域语言概念中解脱出来。
那么在DDD世界中是否有一些普遍认同的约定来处理这些问题?我试图谷歌这个,但无法找到任何权威的。
或许这只是传统DDD方法的一个众所周知的局限,而CQRS或其他方法在这些情况下会更好?
答案 0 :(得分:5)
我认为第二种方法是要走的路。 我们在我们的项目中这样做,但仅限于只读DTO课程。只要你没有使用它们进行插入/更新,我猜就好了。
您可能感兴趣的是answer:
答案 1 :(得分:2)
这是众所周知的DDD限制,而CQRS是解决它的一种非常好的方法。
读取方面的CQRS基本上是解决方案#2,其中包含所有必要的预防措施,以避免将读取模型与可修改的域实体混淆:没有存储库,只读类,等等。
答案 2 :(得分:0)
您是否查看了实体框架?它们具有多个级别的实体延迟加载:MSDN Post
答案 3 :(得分:0)
我不明白为什么在装载下可能会出问题。您知道哪些字段无效,因此可以阻止访问/延迟加载