4

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

我有论坛、线程和帖子实体。

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

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

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

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

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

我应该考虑有界上下文吗?我可以有一个帖子实体和存储库,并且还有一个包含帖子实体的线程聚合吗?

如果我不使用线程/帖子聚合,当我删除线程时我将如何处理帖子删除?我应该在线程存储库上创建一个调用 deleteThread(Thread) 并在发布存储库上调用 deletePostsByThreadId(id) 的服务吗?

这里的 DDD 方式是什么?

4

1 回答 1

4

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

您的程序可能不需要域层,或者您最终会得到一个保存数据的 ForumDTO 类和保存业务逻辑的 Forum,对于帖子或线程来说,这似乎是一种反模式。

你怎么看 ?

更新

我建议你阅读 Eric Evans 的书,它有很好的复杂领域示例,其中 DDD 非常适合。读完这本书后,我非常热衷于应用我所学的知识,但我发现某些面向数据的方法更合适。

对我来说,论坛几乎没有复杂的域逻辑,所以你最终会在数据层和域层之间有一个 1<->1 的映射,正如我所说的,这意味着重复和开销。

看到你的领域的描述,你的方法似乎是面向数据的。例如,直观地讲,论坛有线程和线程有帖子,您描述的域并未反映这一点,并且您似乎规范化了您的对象模型以适合您的数据库模式(这将被规范化)。

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

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

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

于 2009-10-27T20:40:12.313 回答