域驱动设计 - 存储库和聚合根

时间:2009-10-27 20:24:49

标签: repository domain-driven-design entity aggregate

我有一个包含论坛的域名模型。

我有论坛,帖子和帖子实体。

论坛是一个独立的实体。即它不包含线程作为聚合的一部分。这是因为线程不归特定论坛所有(您可以将线程移动到其他论坛)。

我不知道是否应该将帖子建模为线程聚合的一部分。没有线程就不能存在帖子。删除一个帖子,你必须删除帖子,告诉我将帖子作为帖子聚合的一部分。

唯一的事情是,在编辑帖子时也可以单独获取帖子。即用它的id编辑帖子时。

所以我认为拥有一个帖子库对于这个目的是好的,而不是必须获取线程,然后通过线程实体上的方法获取正确的帖子。

拥有单独的帖子库的唯一方法是,在添加帖子时,即addPost(Post),您需要确保已将线程ID分配给帖子实体。使用聚合我想你会在线程实体上使用addPost方法。

我应该考虑有限的背景吗?我可以拥有一个帖子实体和存储库,还有一个包含帖子实体的线程聚合吗?

如果我没有使用线程/帖子聚合,那么在删除线程时如何处理删除帖子?我应该创建一个调用线程存储库中的deleteThread(Thread)和post post repository上的deletePostsByThreadId(id)的服务吗?

这里有什么DDD方式?

1 个答案:

答案 0 :(得分:4)

我想知道,如果你的话,DDD是个好主意。我的意思是论坛本质上是面向数据的。也许你应该考虑一种最简单的方法,只使用经典的面向数据的技术来查询你的数据。 (即LINQ,Hibernate,普通SQL,实体框架或任何你想要的东西,取决于你的平台)

你的程序可能不需要域层,或者你最终会得到一个持有数据的ForumDTO类,以及持有业务逻辑的论坛,对于帖子或帖子来说相同的东西,对我来说它似乎是反模式

您怎么看?

<强>更新

我建议你阅读埃里克埃文斯的书,它有很好的复杂领域的例子,其中DDD非常适合。 读完本书之后,我很热心地应用我所学到的知识,但我已经看到了一些案例面向数据的方法更合适。

对我而言,论坛几乎没有复杂的域逻辑,因此您最终会在数据层和域层之间建立1&lt; - &gt; 1映射,这就像我说的那样意味着重复和开销。

看到您域名的描述,您的方法似乎是面向数据的。 例如,直观地说论坛HAS线程和线程有HAS帖子,你描述的域没有反映出来,你似乎规范化你的对象模型以适应你的数据库模式(将被规范化)。

论坛似乎是成为聚合根的最佳类(它更直观)

如果您真的想使用DDD方法,可以在实体中注入存储库,并根据您的要求为您的域对象提供有意义的名称thread.GetLastPostOf(用户用户)。

但是当你说你应该有一个方法GetPostById的存储库时,我同意你的看法。