【发布时间】:2015-05-07 21:52:23
【问题描述】:
Gof 的命令模式描述了一个带有执行方法的命令。这是在 Wpf 和 Silverlight 中,例如在 ICommand 接口中定义的,并通过 CanExecute 方法进行了丰富。这种类型的命令封装了要执行的动作的参数,以及调用执行的逻辑。为此,它必须知道执行上下文(execute 方法可以在哪里调用所需的方法以及 canexecute 方法可以在哪里验证是否可能)。这种类型的命令负责自己的执行。
例如,在 CQRS 中,使用了其他类型的“命令”。它自己没有执行方法,也不对自己的执行负责。它只是封装了所需的参数并由进行调用的命令处理程序处理。这种类型的命令的优点是它不需要知道执行上下文,因此更容易序列化,并且具有更多的关注点分离。
我的问题是:Gof“命令模式”涵盖了第一种命令。第二种命令有模式名称吗?
我有一个应用程序,我想同时使用这两种类型的命令,我必须为它们选择不同的名称。我倾向于“Command”和“HandledCommand”之类的东西,但如果有的话,我想选择一个众所周知的模式名称。
【问题讨论】:
-
因为第二种模式只存储值,它可能是数据传输对象(DTO)。 GoF 描述了一个非常相似的模式 Memento。
-
是的。从技术上讲,它是一个 DTO 或“参数对象”。但在 CQRS 中,它被称为命令,我想抓住语义,它不仅仅是一堆参数,而是做某事的顺序。此外,参数对象不绑定到特定的方法或操作。但是一个命令(在 cqrs 意义上)是。我认为 memento 在语义上更多是存储对象的内部状态(如序列化)。
-
命令的命名空间分离不够吗?
-
是的。命名空间分离就可以了。但我说的是一个通用库,它具有两种命令的接口。我将它们都称为命令,但是我应该在命名空间中使用什么名称? :-) CommandDescriptor 会和我的 HandledCommand 一样好,但我正在寻找一个众所周知的模式名称。我将把它打开几天然后关闭它,结论是没有标准的模式名称,这样可以吗?
-
也许您的答案是命令处理器,如本视频所示:youtube.com/watch?v=PJvnMP94Kqw
标签: design-patterns