我有论坛,帖子和帖子实体.
该论坛是一个独立的实体.即它不包含线程作为聚合的一部分.这是因为线程不归特定论坛所有(您可以将线程移动到其他论坛).
我不知道我是否应该将帖子建模为线程聚合的一部分.没有线程就不能存在帖子.删除一个帖子,你必须删除帖子,告诉我将帖子作为帖子聚合的一部分.
唯一的事情是,在编辑帖子时也可以单独获取帖子.即用它的id编辑帖子时.
所以我认为拥有一个帖子库对于这个目的是好的,而不是必须获取线程,然后通过线程实体上的方法获取正确的帖子.
拥有单独的帖子库的唯一方法是,在添加帖子时,即addPost(Post),您需要确保已将线程ID分配给帖子实体.使用聚合我想你会在线程实体上有addPost方法.
我应该考虑有限的背景吗?我可以拥有一个帖子实体和存储库,还有一个包含帖子实体的线程聚合吗?
如果我没有使用线程/帖子聚合,当删除线程时如何处理删除帖子?我应该创建一个调用线程存储库中的deleteThread(Thread)和post post repository上的deletePostsByThreadId(id)的服务吗?
这里有什么DDD方式?
我想知道,如果在你的情况下DDD是个好主意.我的意思是论坛本质上是面向数据的.也许你应该考虑一种最简单的方法,只使用经典的面向数据的技术来查询你的数据. (即LINQ,Hibernate,纯SQL,实体框架或任何你想要的,取决于你的平台)你的程序可能不需要域层,或者你最终会得到一个持有数据的ForumDTO类,以及持有业务逻辑的论坛,对于帖子或线程来说相同的东西,对我而言似乎是反模式.
你怎么看 ?
更新
我建议你阅读埃里克埃文斯的书,它有很好的复杂领域的例子,其中DDD非常适合.
读完本书之后,我很热心地应用了我所学到的知识,但我已经看到了一些案例数据导向的方法更合适.
对我来说,论坛几乎没有复杂的域逻辑,所以你最终会在数据层和域层之间建立1< - > 1映射,这就像我说的那样意味着重复和开销.
看到您的域的描述,您的方法似乎是面向数据的.
例如,直观地论坛HAS线程和线程HAS发布,您描述的域没有反映出来,并且您似乎规范化您的对象模型以适合您的数据库模式(将被规范化).
论坛似乎是成为聚合根的最佳类(它更直观)
如果您真的想使用DDD方法,可以在实体中注入存储库,并根据您的要求将域对象有意义的名称作为thread.GetLastPostOf(用户用户).
但是当你说你应该拥有一个带有GetPostById方法的存储库时,我同意你的看法.