Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Design patterns 应用程序服务能否在DDD中的有界上下文中调用其他应用程序服务?_Design Patterns_Architecture_Domain Driven Design - Fatal编程技术网

Design patterns 应用程序服务能否在DDD中的有界上下文中调用其他应用程序服务?

Design patterns 应用程序服务能否在DDD中的有界上下文中调用其他应用程序服务?,design-patterns,architecture,domain-driven-design,Design Patterns,Architecture,Domain Driven Design,域事件是传播已发生事件的一种很好的方式,以便以后可以发生其他事件。据我所知,跨有界上下文使用域事件非常好 假设我们正在创建一个Q和一个类似Stack Overflow的站点。有用户发布问题,问题可以关闭 以下是此类应用程序中的一些可能命令: 提问 悬而未决的问题 禁止用户 域要求声明,如果用户被禁止,则必须关闭其所有问题 当欺诈检测服务检测到用户是欺诈时,应禁止该用户并关闭其所有问题。这个欺诈检测服务能否调用禁止用户服务,后者反过来调用关闭所有用户问题服务 我们不想重复我们已经做过的所有“结

域事件是传播已发生事件的一种很好的方式,以便以后可以发生其他事件。据我所知,跨有界上下文使用域事件非常好

假设我们正在创建一个Q和一个类似Stack Overflow的站点。有
用户
发布
问题
,问题可以
关闭

以下是此类应用程序中的一些可能命令:

  • 提问
  • 悬而未决的问题
  • 禁止用户
域要求声明,如果用户被禁止,则必须关闭其所有问题

当欺诈检测服务检测到用户是欺诈时,应禁止该用户并关闭其所有问题。这个
欺诈检测服务
能否调用
禁止用户服务
,后者反过来调用
关闭所有用户问题
服务


我们不想重复我们已经做过的所有“结束”逻辑。是否只建议发送“UserBannedEvent”之类的事件,并让侦听器调用
关闭所有用户问题
应用程序服务?或者一个可以调用另一个吗?

域事件是触发聚合副作用的好方法。它允许您通过分离责任来创建细粒度和解耦的实现。也就是说,如果你想坚持DDD

您可能会问“为什么不使用命令?”。嗯,您可以使用命令,但在我看来,这种情况在语义上是错误的。命令是关于您希望发生的事情,但是欺诈检测只是发生了,您应该声明它是这样的

如果需要,您可以将命令作为副作用运行,由事件触发(注意不要过度设计)

是否只建议发送“UserBannedEvent”之类的事件,并让侦听器调用“关闭所有用户问题”应用程序服务?或者一个人可以打电话给另一个人

  • 您可以运行
    DetectFraudCommand
    命令来检测欺诈
  • 欺诈检测服务
    生成
    欺诈检测事件
    事件
  • 禁止用户服务
    欺诈检测事件
    触发,并调用
    关闭问题命令
    命令
  • 关闭所有用户问题服务
    禁止用户
  • 这使得它松散耦合,并且清楚地描述了业务逻辑。此外,它的扩展性更好:您可以为
    FraudDetectedEvent
    连接任何其他侦听器,而无需触摸
    欺诈检测服务
    ,如果您直接运行命令,这是不可能的


    如果您需要事务一致性,它会变得更加棘手,但可以通过适当的事件调度器设计来解决


    沃恩·弗农(Vaughn Vernon)对聚合设计有一个很好的相关阅读:。

    请您在步骤中阐明应用程序级别与域级别的区别?这仍然留下了一些未回答的问题:根据DDD,域层不应该控制自己的持久性;它应该由应用层“编排”。因此:如果有业务需求“当用户被禁止时,所有问题都必须关闭”,当事件被触发时,如果应用程序级命令拾取它,它可以“协调”关闭问题等,但这是域需求,因此在错误的位置,不是吗?如果域选择了它,它就不能自己持久。“如果您需要事务一致性,它会变得更加棘手,但可以通过适当的事件调度器设计来解决。”我对此也很好奇。您能提供一个参考或解释吗?这里的每个步骤都描述了域层逻辑,这是通过设计实现的(意思是,每个DDD)。当然,实际实现可能会使用多个层。命令通常是域级别的(因为它们是业务意图),尽管命令处理程序可能位于应用程序级别。我通常遵循这条经验法则来确定域应用程序边界:如果您的业务分析师不能理解整个业务逻辑,只阅读域层的内容——这是糟糕的设计。例如,这里的应用程序/基础结构层就是事件引擎。我希望我正确地回答了您的问题事务一致性是另一个完整的讨论,但简而言之,大多数DDD专家建议遵循最终一致性,因为它更易于扩展(由于争用较少,锁数量较少,等等),但有时您确实需要严格的串行执行和跨多个服务甚至域的原子持久性—您的设计将缺乏性能和可伸缩性,但就业务价值而言,它可能是值得的