如何使用NHibernate从聚合根的子集合中最佳地选择单个实体?

时间:2011-09-20 09:27:36

标签: nhibernate aggregateroot

我想知道在以下情况中被认为是更好或更正确的做法:

我已经使用NHibernate映射了以下业务实体:

  • WallPost
  • WallPostComment

Wall拥有零对多的WallPost。 WallPost拥有零对多的WallPostComments。聚合根是Wall。

我正在编写一个将WallPostComment添加到WallPost的任务。该应用程序是一个MVC应用程序,添加新WallPostComment的请求包含注释所属的WallPost的id。为了添加评论,我需要检索它应该添加到的帖子。我的问题是:这样做的最佳/最正确的方法是什么?

到目前为止,我尝试过两种方法,一种感觉更“正确”,尽管它效率低下。另一种更有效的方法感觉是“错误的”。

1)我从会话中加载Wall聚合根,并从其Posts集合中选择FirstOrDefault。这感觉'正确',因为我通过聚合根访问墙贴,但这样做会导致从数据库中取出所有墙贴(无界结果集)。

2)我使用请求传递给我的wallPostId直接从会话加载墙贴。这感觉“错了”,因为我在聚合根周围 - 但是对于单行数据,它只是数据库中的一次点击。

哪种方法更好或更首选?您有什么其他建议吗?

2 个答案:

答案 0 :(得分:2)

似乎WallPost是一个聚合根本身的候选人, 这样它就有了自己的存储库,您可以单独获取它并对其进行操作及其注释。当聚合根(WallPost)可以引用另一个聚合根(Wall)时没有问题。

如果您遇到无法修复设计以使WallPost成为聚合根的情况,您可以利用Role InterfaceFetching Strategy的概念来区分存储库获取在某些方面的限制聚合根而不是完全以这种方式获取它,你可以获取Wall聚合根而不获取所有的墙贴,并获取所需的墙贴以进行更新。

最糟糕的情况是,当你无法使WallPost聚合根并且你不想应用角色接口和/或获取策略时,你可以使用命令处理程序创建一个名为CommentWallPostCommand(Comment)的命令,该命令将获取确切需要的wallpost(投影的聚合root并更新它,至少有明确的命令会使设计更加清晰明确。

答案 1 :(得分:2)

真的有墙吗? Wall和你域中的其他actor之间有什么关系?我猜想Wall与用户连接,并且用户只有一面墙。那是对的吗?在这种情况下,墙只是WallPosts和相关评论的集合。在这种情况下,您的WallPost是您的聚合根,并且根本没有Wall。