CQRS/DDD:虚拟博客/帖子/类别/标签示例

Ben*_*min 4 domain-driven-design cqrs

仍在深入研究CQRS实施实验,我决定从头开始浏览我的博客并将其用作沙盒.

我阅读了很多有关有界背景的内容,在我看来,这是所有这些中最精巧的方法,也许是解释和应用于实际项目中最困难的方法.

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

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

域规则非常简单:

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

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

只有这些规则,我们已经得到了几个有界的背景,我是对的吗?

  • 用户(编写者)编写后置上下文.在这些上下文中,Post是聚合根

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

  • 用户(读者)按标签浏览帖子.在这种情况下,好吧,我不确定...... ;-)

我认为对吗?

鉴于我(右),我想知道,在执行这个时,谁负责创建不同的对象和关系?

以用户撰写新博客帖子的上下文为例,我真的不知道应该在哪里创建标签实例,以及我是否应该在写模型中创建Post及其标签之间的关系.类别也是如此,不知道:p

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

需要一些脑电波来清楚地看到这一点;-)

为了添加新帖子,到目前为止,我的控制器要求命令总线处理"ComposeCommand",处理程序(PostService)创建一个新的"Post"实例,在其上调用compose方法并最终要求写入持久性以保存最新帖子.

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

在所有这些我不知道如何介绍"类别"和"标签".

谢谢.

eul*_*rfx 5

只有这些规则,我们已经得到了几个有界的背景,我是对的吗?

不,博客应用程序通常只会跨越一个有限的上下文.当模型在不同的上下文中具有不同的含义时,您需要多个BC.当您正在寻址的域由多个子域组成时,通常会发生这种情况.

但是,您将拥有多个聚合 - 您可以在一个BC中拥有多个聚合根.确定域模型中的聚合是基于几个因素.首先,聚合形成围绕与某个根实体相关联的一组内聚行为的一致性边界.例如,Post可能是AR,作为Writer(作者).要深入了解聚合设计,请查看有效聚合设计.

在所有这些我不知道如何介绍"类别"和"标签".

通常,将post类别和一组标记指定为命令的一部分,该命令会在您的情况下创建post- ComposeCommand.根据您是否将类别和标记建模为聚合或值对象,该命令将指定CategoryIdTagIds,或仅指定值.