好吧,我正在尝试实现命令模式来创建与对象的交互。
几乎所有将创建的命令都包括对对象的请求和来自该对象的响应。
所以问题是 - 如何管理这些响应?
当所有命令都无效时,它很容易制作。不管它们是什么,如果它们实现了@executable@接口,你就可以执行它们,所以有
无效执行(对象参数)
但是,当他们的反应有不同类型时该怎么办?也许命令模式不适合这个项目?
好吧,我正在尝试实现命令模式来创建与对象的交互。
几乎所有将创建的命令都包括对对象的请求和来自该对象的响应。
所以问题是 - 如何管理这些响应?
当所有命令都无效时,它很容易制作。不管它们是什么,如果它们实现了@executable@接口,你就可以执行它们,所以有
无效执行(对象参数)
但是,当他们的反应有不同类型时该怎么办?也许命令模式不适合这个项目?
ICommandResponse Execute(object params)
您可以返回一个带有 ResponseType 属性的接口,该属性为您提供有关具体响应类型的信息。
利用 .NET 的内置命令模式类型和 lambda。
首先,您不需要自己的命令模式接口。使用Action<T>
. 因此,例如,任何调用的命令都必须具有以下签名:
void Command(object params)
然后,对于任何不属于这种形式的命令,为其提供一个 lambda shim,例如:
() => { SomeCommandThatTakesTwoParamsAndRetrunsInt(parms.part1, params.part2); }
上面的 lambda 然后符合void Command(object params)
要求。
命令执行结果可能是事件。
例子:
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...
}
}