2010-06-23 68 views
0

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

您将在列表中使用单独的实体类型还是仅填充完整的实体类型? 你会使用继承吗?

回答

0

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

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

您也可以做某些事情来降低在域图层中使用整个实体的性能损失。有一点需要注意的是实现某种缓存旁路实现。当一个实体被请求时,检查它是否被缓存。如果是,则返回缓存版本。如果不是,则在返回之前将其拉出并缓存。当实体更新时,将其从缓存中逐出并进行更新。我故意创建了自己的具体存储库实现,以实现缓存感知以实现此目的。另一件需要考虑的方法是尽可能多地进行细粒度的操作。尽管起初这似乎不合逻辑,但如果实体通常是从数据存储中“获取”的,则很容易设置一些日志记录来衡量缓存命中次数以缓存未命中数。

即将到来的全部圈子,你的问题......我处理的大多数清单都很小,所以我承担了加载整个实体的惩罚。假设大多数用例将涉及用户钻取到一个或多个项目中,由于缓存保留实现,它们被预先缓存。项目的数量是流畅的,但我通常将这种方法应用于列表中少于25个实体的任何项目。

对于较大的列表,我只使用ID。最有可能的是,这里的用例是某种搜索结果。例如,搜索结果通常是分页的,这不适合上述模式。相反,我使用更大的ID列表作为我感兴趣的实体的滑动范围窗口,然后传递给GetRangeById()方法,以使我的所有存储库都有 - 专门写入一个标识符列表并加载它们一个一段时间,他们被缓存。从本质上讲,这将需要一个更大的轻量级列表,并且在给定的时间点上我感兴趣的区域只需要零。

有了这样的方法,要认识到的重要一点是它具有高度的可扩展性。它可能不像使用小型数据集的非缓存方法那么快,但是对于更大的数据集来说性能会更好。这里有一个隐含的操作性能开销,但它的降低速度比标准的“负载”升级模式要慢。

0

您可以使用CQRS模式分隔查询处理和命令处理。而且即使在单个数据库上也可以实现。在这种情况下,您可以将视图模型直接映射到数据库中的表格(例如通过NHibernate)。命令(写)将通过真正的域模型,并将保存在数据库中。查询(就像给我一个实体列表)可以绕过DB直接进入域。查询域对象是毫无意义的,因为你实际上不调用任何业务逻辑,只是检索一些数据。

您还可以通过为命令端和查询端分开存储来将此解决方案扩展到全功能CQRS。查询方将通过复制或发布/订阅消息进行同步。

相关问题