【问题标题】:Command Pattern with responsible commands带有负责任命令的命令模式
【发布时间】:2013-11-17 07:42:51
【问题描述】:

好吧,我正在尝试实现命令模式来创建与对象的交互。

几乎所有将创建的命令都包含对对象的请求和来自该对象的响应。

所以问题是 - 如何管理这些响应?

当所有命令都无效时,它很容易制作。不管它们是什么,如果它们实现了@executable@接口,你就可以执行它们,所以有

无效执行(对象参数)

但是,当他们的响应类型不同时该怎么办?也许命令模式不适合这个项目?

【问题讨论】:

    标签: c# design-patterns command


    【解决方案1】:
    ICommandResponse Execute(object params)
    

    您可以返回一个带有 ResponseType 属性的接口,该属性为您提供有关具体响应类型的信息。

    【讨论】:

    • 例如,我像这样的 StringResponce 类:ICommandResponce { Type ResponceType{ get {return typeof(String);}} ..... }
    【解决方案2】:

    利用 .NET 的内置命令模式类型和 lambda。

    首先,您不需要自己的命令模式接口。使用Action<T>。因此,例如,任何调用的命令都必须具有以下签名:

    void Command(object params)
    

    然后,对于任何不属于这种形式的命令,为其提供一个 lambda shim,例如:

    () => { SomeCommandThatTakesTwoParamsAndRetrunsInt(parms.part1, params.part2); }
    

    然后上面的 lambda 符合 void Command(object params) 的要求。

    【讨论】:

    • @Virviil 这就是 lambdas 的用途,它们是你的命令的包装器,它们不是无效的。
    【解决方案3】:

    命令执行结果可能是事件。

    例子:

    class ChangeNameCommand
    {
        int _id;
        string _name;
        IRepository _repository;
        IEventPublisher _publisher;
    
        public ChangeNameCommand(int id, string name, IRepository repository, IEventPublisher publisher)
        {
            _id = id;
            _name = name;
            _repository = repository;
            _publisher = publisher;
        }
    
        public void Execute()
        {
            User user = _repository.Get(_id)
            user.Name = _name;
            _repository.Save(user);
    
            NameChangedEvent e = new NameChangedEvent();
            _publisher.Publish(e);
        }
    }
    
    class UserNameChanged : IHandler<NameChangedEvent>
    {
        public void Handle(NameChangedEvent e)
        {
            //TODO...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 2012-10-24
      • 2021-11-25
      • 1970-01-01
      相关资源
      最近更新 更多