Command Dispatcher 和 Mediator 设计模式之间有什么区别?

What are the differences between the Command Dispatcher and Mediator Design Pattern?

最近有人向我介绍了命令调度程序模式,它可以帮助我们的项目中的命令与基于域驱动设计方法和 CQRS 模式的命令处理程序分离。

不管怎样,我把它和 Mediator 设计模式搞混了。

Robert Harvey has already answered一个关于Command Dispatcher模式的问题如下:

A Command Dispatcher is an object that links the Action-Request with the appropriate Action-Handler. It's purpose is to decouple the command operation from the sending and receiving objects so that neither has knowledge of the other.

根据维基百科,The mediator pattern 被描述为:

With the mediator pattern, communication between objects is encapsulated within a mediator object. Objects no longer communicate directly with each other, but instead communicate through the mediator. This reduces the dependencies between communicating objects, thereby reducing coupling.

因此,据我了解,它们都将命令与指挥官分开,这使我们能够与调用者分离。

我在 Github 上看到一些项目使用命令调度程序模式为请求的命令调用所需的处理程序,而其他项目则使用调解器模式来调度消息。 (例如,在大多数 DotNet 项目中,MediatR 库用于满足这一点)。

但是,我想知道在我们基于 DDD 方法和 CQRS 模式的项目中使用一种模式与使用另一种模式的区别和好处是什么?

中介者模式在其纯概念上更底层和通用。中介者模式不定义您使用的通信类型或消息类型。在 Command Dispatcher 中,您处于上层(上下文和概念上),其中已经定义了通信和消息的种类。

您应该能够以中介者模式(ergo with MediatR)为基础实现命令调度程序模式。

Command Dispatcher 和 Mediator 模式(以及事件聚合器模式)有相似之处,因为它们引入了 mediating 组件来解耦组件之间的直接通信。虽然每一种都可以用于实现另一种模式所针对的用例,但它们都是具体的模式,它们在最初的目标问题以及它们适合每种需求的级别上都有所不同。

命令调度程序模式主要是一种约定优于配置的方法,通常用于促进 UI 层调用应用层,使用离散类型来处理命令和查询,而不是更传统的应用程序服务设计.当将通常可能在粗粒度服务(例如 OrderService)中表示为离散组件(例如 CreateOrderCommand、GetOrderQuery 等)的查询和命令表示时,这可能会在 UI-级别组件,例如 ASP.Net MVC 控制器,否则构造函数可能需要注入一系列离散接口,每个用户请求通常只需要其中一个接口(例如控制器操作)。引入调度程序大大减少了实现 ASP.Net MVC 控制器等组件所需的代码量,因为唯一需要注入的依赖项是调度程序。虽然不一定是该模式的主要动机,但它也引入了统一应用其他模式(例如管道和过滤器)的能力,并提供了一个可以在 运行 时间确定命令处理程序实现的接缝。 MediatR 库实际上是这种模式的实现。

调解器模式涉及调解组件的创建,调解组件封装特定于域的编排逻辑,否则需要组件之间的耦合。也就是说,在这种情况下,中介组件不仅仅是一个愚蠢的调度程序(“嘿,有人知道如何处理 XYZRequest 吗?”),而是专门为遵循给定操作发生时需要发生的一组特定操作,可能跨多个组件。 GoF Design Patterns 书中给出的示例是一个 UI 组件,其中包含许多相互关联的元素,因此对一个组件的更改需要影响对其他组件的更改,反之亦然(例如,在文本字段中键入会导致更改一个下拉列表和多个复选框和单选按钮,同时在下拉效果中选择条目会更改为文本字段、复选框和单选按钮等中的内容)。使用提供的解决方案,中介组件包含逻辑以准确了解哪些组件需要更新,以及如何更新其他每个组件。

因此,当您需要定制组件以促进许多其他组件如何交互时,将使用调解器模式,否则正常耦合会对可维护性产生负面影响,而命令调度程序模式仅用作哑函数路由器将调用者与被调用函数分离。