Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design 我应该如何建模';知道';何时完成聚合更新以触发事件?_Domain Driven Design_Consistency - Fatal编程技术网

Domain driven design 我应该如何建模';知道';何时完成聚合更新以触发事件?

Domain driven design 我应该如何建模';知道';何时完成聚合更新以触发事件?,domain-driven-design,consistency,Domain Driven Design,Consistency,聚合B的计算结果最终需要与聚合A一致。聚合A可以使用八种方法进行变异,每种方法都会导致B需要更新。这似乎是一个最终一致的任务,但实际的更新时间框架应该在几秒钟之内 我不想依赖应用层来“记住”触发更新。(还有)建立模型的最佳方法是什么 使用具有双重分派的域服务是一件痛苦的事情: 服务必须是a 通常会在一行中调用多个变异方法,我不希望每次调用方法时都触发B中的更新 构造函数注入也是一个难题: 在某些情况下,A不会发生变异,因此被迫实例化并注入域服务以监视肯定不会发生的变异是错误的 再说一次,通

聚合
B
的计算结果最终需要与聚合
A
一致。聚合
A
可以使用八种方法进行变异,每种方法都会导致
B
需要更新。这似乎是一个最终一致的任务,但实际的更新时间框架应该在几秒钟之内

我不想依赖应用层来“记住”触发更新。(还有)建立模型的最佳方法是什么

  • 使用具有双重分派的域服务是一件痛苦的事情:

    • 服务必须是
      a
    • 通常会在一行中调用多个变异方法,我不希望每次调用方法时都触发
      B
      中的更新
  • 构造函数注入也是一个难题:

    • 在某些情况下,
      A
      不会发生变异,因此被迫实例化并注入域服务以监视肯定不会发生的变异是错误的
    • 再说一次,通常会在一行中调用多个变异方法,我不想在每次调用方法时触发
      B
      中的更新
  • 域事件听起来不错,但我不确定它是什么样子。每个变异方法都会引发一个域事件

    • 再说一次,通常会在一行中调用多个变异方法,我不想在每次调用方法时触发
      B
      中的更新
  • A
    完成更新并知道它是否已更新时,我如何建模“知道”,这样我就可以触发
    B
    的更新,而无需依赖应用层每次都以特定顺序调用方法


    或者这真的是一个存储库级别或应用程序级别的问题,尽管这似乎是一个域需求?

    您的第三个问题。是一种常用且非常直接的技术:

  • 在型号a更新时引发域事件
    AChangedType1
    ,…,
    AChangedTypeN
  • 让saga/流程管理器监听
    AChangedTypeX
    ,并发出相应的
    updateTypex
    命令
  • 它是松散耦合的(现在A和B都不是彼此相关的)并且可以很好地扩展(易于并行化),它们之间的关系在长时间运行的过程中被显式地建模


    如果您不想在A上的每次更改时触发对B的更新,那么可以在发出
    UpdateBTypeX
    命令之前将更新延迟一段时间(正如在网络协议中通常所做的那样,请参见,例如,

    那么,如果对
    A
    的更改将被丢弃而不是持久化,我如何防止
    B
    更新?我不确定如何建模的部分是“知道
    A
    已完成更改”部分。它必须包含来自存储库层的一些提示,对吗?是的,没错。当且仅当
    A
    的事务成功提交时,存储库使用的基础结构才会发布域事件。酷,对该部分进行建模的好方法是什么?我一直在想基础结构如何知道这些事件必须等待(而其他人不知道),以及是什么给了基础架构丢弃或传递它们的信号。人们通常做什么?这高度依赖于您的域,没有通用的解决方案。但是,一般来说,如果
    B
    只能在
    A
    X
    Y
    Z
    事件发出时更新,那么你可以使用一个简单的状态机来跟踪所看到的事件。如果你只是想避免对
    B
    进行多个链式更新,请等待给定的时间,比如1秒,然后发送命令更新
    B
    ,同时忽略在发出超时和发送命令之间收到的所有其他事件。“记住触发更新”这不是我会使用的短语。它似乎意味着某些东西被存储在某个地方,稍后由另一个进程或线程拾取,但事实并非如此。如果你在应用程序服务中按顺序执行两件事情,它们会立即在进程中执行。实际上,这远不是“记住事情”而不是在两个动作之间通过消息传递系统插入一次行程。“通常会连续调用多个变异方法,我不想触发…”-这里可能存在粒度问题。如果有一批操作导致
    B
    中出现单一反响,那么该批操作可能会有一个通用语言的名称,并且您应该有一个适当粒度的应用程序服务来覆盖它(假设,由您的集合发布的相应事件)