sil*_*ter 0 domain-driven-design cqrs event-sourcing
什么是在ES中组织我的事件流的最佳方式.对于事件流,我指的是聚合的所有事件.
鉴于我有project一些数据和一个列表tasks.
现在我有一个Guid是AggregateID我的streamID.到目前为止,我可以 - >使用该ID重新创建给定项目的状态 - >我可以projects使用自定义投影组合列表
问题是如何处理todos?这应该在下面处理project stream id还是应该有它自己todo stream id?
如果a todo将它分开,将stream如何将其链接到拥有者project.如何project知道todo streams给定的所有内容project.这意味着对项目的所有更改都todo list应该被识别为Commands和Events(更多事件).
如果我也想在free todo's没有项目关系的情况下允许.是否需要拥有自己的类型并在顶部stream处理freeTodo.而所有的名单todos是否project相关,也将是所有的投影todo和freeTodo相关流?
所以我想主要的问题是我如何处理嵌套聚合,以及如何定义事件存储流和链接?
任何提示,技巧,最佳实践或资源将受到高度赞赏.
//编辑更新
首先要感谢@VoiceOfUnreason花时间详细回答这个问题.我添加了标签DDD,因为我有一种奇怪的感觉,它与有界的背景问题相关,这个问题大多数时候都没有黑色或白色的决定.显然,域名有更多的深度和细节,我简化了示例.在下面我分享了一些让我质疑的细节.
在我的第一个想法中,我为todo一个属性定义了一个聚合project id.我将此project属性定义为option type (Nullable)涵盖项目相关和免费待办事项之间的差异.但是,以下用例/业务规则让我重新思考.
系统还应包含免费todo's,允许用户安排个人tasks而非项目相关(人力资源培训等).所有这些todo's都应该出现在他们的projects或完整的todo列表中(项目相关和免费).
A project只能在完成后才能完成/关闭todo's.这将混合来自aggregate project的信息aggregate todo.所以这里没有明确的界限.我的想法是:a)我可以利用todo read modelin project aggregate进行验证.b)todo's在项目聚合范围内定义某种列出的结构(如果是这样的话).这将处理项目上下文中的待办事项并定义明确的界限
c)提供某种服务,todo为项目验证提供信息,以某种方式引用点a.).
所有感觉真的耦合= - /
如果您或某人有时间在这里分享更多细节和意见,那将会很棒.太感谢了.
提醒:ddd中的战术模式主要是OO最佳实践的枚举.如果在OO中这是一个坏主意,那在DDD中可能是一个坏主意.
主要问题是如何处理嵌套聚合
你重新设计你的模型.
嵌套聚合表明你完全丢失了情节; 聚合边界永远不应重叠.重叠边界类似于封装违规.
如果todo有单独的流,那么如何将它链接到拥有项目.
最可能的答案是Todo将拥有projectId属性,其值通常指向系统中其他位置的项目.
项目如何了解给定项目的所有todo流.
事实并非如此.您可以构建组成项目历史和todos历史的读取模型,以生成单个只读结构,但项目聚合 - 负责确保边界内状态的完整性 - 不会t看看todo对象里面.
这意味着对todo列表的所有更改也应该被识别为项目中的命令和事件(更多事件).
不,如果它们是单独的聚合,则事件是完全独立的.
在某些情况下,您可以使用todo生成的事件中的值作为调度到项目的命令中的参数,反之亦然,但是您需要将它们视为具有可能会或可能不会话的对话的单独事物,达成协议.
可能性:可能是自由站立的待办事项与项目相关的待办事项实际上是不同的东西.请咨询您的域名专家 - 他们可能在无处不在的语言中有单独的术语,或者在讨论您可能会发现他们应该在UL中有不同术语的详细信息时.
或者,todo可以是单独的聚合,并且业务适应接受这样的事实:有时项目的状态和待办事项的状态不一致.您可以检测出差异并在必要时缓解问题,而不是试图阻止模型进入聚合不同意的状态.