【问题标题】:Decouple command from its handler将命令与其处理程序分离
【发布时间】:2016-11-13 14:16:16
【问题描述】:

我的命令和处理程序位于两个不同的层。我希望我的命令成为 POCO,并且对它的处理程序一无所知。 我想到的解决方案是这样的:

public interface ICommand
{
    string GetHandler();
}

public interface ICommandHandler
{
    void HandleCommand(ICommand command);
}

public class XCommand : ICommand
{
    //...
    public string GetHandler()
    {
        return "xh";
    }
}

[Handler("xh")]
public class XCommandHandler : ICommandHandler
{
    public void HandleCommand(ICommand command)
    {
        //handle
    }
}

这是命令模式吗?

【问题讨论】:

  • 这看起来像命令/查询响应分离 (CQRS)
  • 动词handle 有点模棱两可。如果你给出一个处理命令的具体例子,你的问题会更清楚。问题是在Command 模式中,有一个execute() 方法可以执行命令。如果这就是您所说的句柄,那么正如@jaco0646 所说,它被封装在命令本身中。另一方面(没有双关语),Invoker 与经典模式中的命令完全分离。调用者“处理”命令,但实际上只是在它们上调用execute()
  • 如您所说,使用“命令”和“句柄”可能会造成混淆。我有 FindRequest 和 Finder,我希望将这些对象解耦。于是我创建了一个FindExecuter,客户端通过FindRequest来执行。我在上面的帖子中放了一张图片来澄清问题。

标签: design-patterns command-pattern


【解决方案1】:

不,Command Pattern 将“处理程序”逻辑封装到命令对象本身中,从而产生一个可以在任何地方执行的黑盒。换句话说,命令模式中没有处理程序角色。它关心的是何时如何执行命令,而不是在执行。

但是,还有其他几个behavioral patterns 可以确定谁处理请求或事件。值得注意的是,Chain-of-CommandObserver 模式符合这一要求。

【讨论】:

  • 谢谢,我认为正如彼得所说,它看起来像 CQRS。
猜你喜欢
  • 2021-08-01
  • 2020-04-12
  • 2011-06-28
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多