1

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

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

  • 海报
  • 墙邮评论

一堵墙有零对多的墙贴。WallPost 具有零对多的 WallPostComments。聚合根是 Wall。

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

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

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

2) 我使用请求传递给我的 wallPostId 直接从会话加载墙帖。这感觉“错误”,因为我要绕过聚合根 - 但它是对单行数据的数据库的一次点击。

哪个是更好或首选的方法?你还有什么建议?

4

2 回答 2

2

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

于 2011-09-20T13:38:13.393 回答
2

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

如果您遇到无法修复设计以使 WallPost 成为聚合根的情况,您可以利用角色接口获取策略的概念来区分存储库获取限制在聚合根的某些方面,而不是完全获取它这样您就可以在不获取所有墙帖的情况下获取墙聚合根,并获取所需的墙帖进行更新。

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

于 2011-09-20T10:30:41.113 回答