Domain driven design 有没有处理实体列表的好模式

Domain driven design 有没有处理实体列表的好模式,domain-driven-design,entities,Domain Driven Design,Entities,在DDD中,处理不同版本的实体的最佳模式是什么,例如列表中的实体与完整对象。我希望避免在列表中显示实体时获取不需要的属性的开销 您会在列表中使用单独的实体类型,还是只是部分填充完整的实体类型? 您会使用继承吗?我理解您在域中创建模型视图的冲动,但建议不要这样做。就个人而言,我使用域内的整个实体,而不管情况如何。实体就是实体,任何更少或更多的东西都感觉不干净。但这并不意味着我不能使用对实体的引用来帮助集中使用列表中的项目 在我的实现中,实体不跨越域边界。相反,我返回一种类型的DTO,并拥有可以从中

在DDD中,处理不同版本的实体的最佳模式是什么,例如列表中的实体与完整对象。我希望避免在列表中显示实体时获取不需要的属性的开销

您会在列表中使用单独的实体类型,还是只是部分填充完整的实体类型?
您会使用继承吗?

我理解您在域中创建模型视图的冲动,但建议不要这样做。就个人而言,我使用域内的整个实体,而不管情况如何。实体就是实体,任何更少或更多的东西都感觉不干净。但这并不意味着我不能使用对实体的引用来帮助集中使用列表中的项目

在我的实现中,实体不跨越域边界。相反,我返回一种类型的DTO,并拥有可以从中提取视图的应用程序服务。例如,这允许演示者从DTO生成正确的视图模型并将其提供给视图。我不知道您是在谈论域服务中的操作还是在应用程序服务中的操作,但是您可以做一些事情,这些事情可以应用于其中一项或两项

您还可以做一些事情来降低在域层中处理整个实体的性能损失。需要注意的一点是实现某种缓存旁实现。当一个实体被请求时,检查它是否被缓存。如果是,则返回缓存的版本。如果不是,请将其拉出来,然后在返回之前将其缓存。更新实体时,将其从缓存中移出并执行更新。我特意创建了具体的存储库实现,以便于实现缓存感知。另一个要考虑的问题是使用这样的方法,尽可能多地完成细粒度的操作是有益的。虽然一开始这似乎不合逻辑,但如果实体通常是从数据存储中获取的,那么很容易设置一些日志来测量缓存命中到缓存未命中的数量

绕一圈来,回答你的问题。。。我处理的大多数列表都很小,因此我需要加载整个实体。假设大多数用例都涉及到用户钻取一个或多个项目,则由于cache-aside实现,这些项目是预缓存的。项目的数量是可变的,但我通常将此方法应用于列表中少于25个实体的任何项目

对于较大的列表,我只使用ID。这里的用例很可能是某种搜索结果。例如,搜索结果通常是分页的,这不符合上述模式。相反,我使用更大的ID列表作为我感兴趣的实体的滑动范围窗口,然后将其传递给一个GetRangeById方法,我的所有存储库都编写了该方法,以便有目的地获取标识符列表,并一次加载一个,以便缓存它们。本质上,这将需要一个更大的轻量级列表,并且在给定的时间点只关注我感兴趣的领域


有了这样的方法,重要的是要认识到它是高度可伸缩的。对于较小的数据集,它的基线速度可能不如非缓存方法快,但对于较大的数据集,它的性能会更好。这里有一个隐含的操作性能开销,但其降低速度也比标准的加载模式慢。

您可以使用CQRS模式来分离查询处理和命令处理。您甚至可以在单个数据库上执行此操作。在这种情况下,您可以通过NHibernate将视图模型直接映射到数据库中的表。命令写入将通过真实的域模型进行,并将持久保存在数据库中。像GetMe a list of entities这样的查询将绕过域a go straight do DB。查询域对象没有意义,因为实际上您不调用其中的任何业务逻辑,只检索一些数据

通过为命令端和查询端提供单独的存储,您还可以将此解决方案扩展到功能齐全的CQR。查询端将通过复制或发布/订阅消息进行同步