Domain driven design CQRS/DDD:虚拟blog/post/category/tags示例

Domain driven design CQRS/DDD:虚拟blog/post/category/tags示例,domain-driven-design,cqrs,Domain Driven Design,Cqrs,我仍在深入研究CQRS实现实验,我决定从头开始我的博客,并将其用作沙箱 我读了很多关于有界上下文的书,在我看来,这是所有这些中最微妙的方法,也许是最难解释和应用于实际项目的方法 幸运的是,我的领域非常简单;-) 我试图识别不同的有界上下文,并确定在每个上下文中哪个模型成为聚合根 域规则非常简单: 当作者撰写博客文章时,他必须选择一个类别来保存他的文章,并且他可以选择多个标签来提高他的文章的可见性 当读者访问博客时,他可以通过类别或标签浏览博客帖子 只有这些规则,我们已经得到了几个有界上下文,

我仍在深入研究CQRS实现实验,我决定从头开始我的博客,并将其用作沙箱

我读了很多关于有界上下文的书,在我看来,这是所有这些中最微妙的方法,也许是最难解释和应用于实际项目的方法

幸运的是,我的领域非常简单;-)

我试图识别不同的有界上下文,并确定在每个上下文中哪个模型成为聚合根

域规则非常简单:

  • 作者撰写博客文章时,他必须选择一个类别来保存他的文章,并且他可以选择多个标签来提高他的文章的可见性

  • 读者访问博客时,他可以通过类别或标签浏览博客帖子

只有这些规则,我们已经得到了几个有界上下文,对吗

  • 用户(编写者)组成一个post上下文。在这些上下文中,Post是聚合根

  • 用户(读者)按类别浏览帖子。在这些上下文中,类别是聚合根

  • 用户(阅读器)通过标签浏览帖子。在这种情况下,我不确定…;-)

我想的对吗

鉴于我是(对的),我想知道,在实现这一点的过程中,谁负责创建不同的对象和关系

以用户撰写新博客文章的上下文为例,我真的不知道应该在哪里创建标记实例,以及是否应该在write模型中创建文章与其标记之间的关系。类别也是一样,不知道:p

此外,有界上下文是否意味着特定模型?这意味着对于每个有界上下文,我将有一个不同的对象图(在写模型中)

需要一些脑波才能在我的脑海中看清这一点;-)

到目前为止,为了添加一个新的post,我的控制器要求命令总线处理一个“ComposeCommand”,处理程序(PostService)创建一个新的“post”实例,调用其上的compose方法,最后要求写持久性保存新的post

Post::compose()方法引发一个“PostComposedEvent”事件,读取模型监听该事件以更新其数据

在这一切中,我不知道如何引入“类别”和“标签”

谢谢

只有这些规则,我们已经得到了几个有界上下文,是吗 对吧?

不,一个博客应用程序通常只跨越一个有界的上下文。当模型在不同的上下文中具有不同的含义时,您需要多个BC。这通常发生在您要寻址的域变得较大,由多个域组成时

但是,您将拥有多个聚合-您可以在单个BC中拥有多个聚合根。确定域模型中的聚合基于几个因素。首先,聚合围绕与某个根实体相关联的一组内聚行为形成一致性边界。例如,一篇文章就像一个作家(作者)一样可能是AR。要深入了解聚合设计,请参阅

在这一切中,我不知道如何引入“类别”和“标签”


通常,一个post类别和一组标记被指定为在您的案例中创建post-ComposeCommand的命令的一部分。根据您是将类别和标记建模为聚合对象还是值对象,该命令将指定CategoryId和TagID,或者仅指定值。

“我的域非常简单”。在这种情况下,您可能只有1个有界上下文。也许你把聚合误认为是有界上下文?好吧,谢谢,我想我明白了,我从错误的角度看它。我是从用户体验的角度考虑的,而不是模型的真正“意义”,你是对的,模型在这里保持不变,实际上是聚合根发生了变化。关于类别和标记的创建,我理解值对象和对象引用之间的区别,我们应该尽量避免。我想知道这些VO或参考应该在哪里创建/实例化?在Post::command()方法中?在命令处理程序中(可能使用工厂?)