Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有负责命令的命令模式_C#_Design Patterns_Command - Fatal编程技术网

C# 具有负责命令的命令模式

C# 具有负责命令的命令模式,c#,design-patterns,command,C#,Design Patterns,Command,我正在尝试实现命令模式来创建与对象的交互 几乎所有要创建的命令都包括对对象的请求和来自该对象的响应 所以问题是——如何管理这些反应 当所有命令都为空时,它很容易生成。无论它们是什么,只要它们实现@executable@interface,您就可以执行它们,所以您必须 无效执行(对象参数) 但是,当他们的回答有不同的类型时,该怎么办呢?也许命令模式不适合这个项目 ICommandResponse Execute(object params) 您可以返回一个带有ResponseType属性的接口,

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

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

所以问题是——如何管理这些反应

当所有命令都为空时,它很容易生成。无论它们是什么,只要它们实现@executable@interface,您就可以执行它们,所以您必须

无效执行(对象参数)

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

ICommandResponse Execute(object params)

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

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

首先,您不需要自己的命令patetrn接口。使用
操作
。因此,例如,调用的任何命令必须具有以下签名:

void Command(object params)
然后,对于任何非此形式的命令,为其提供lambda垫片,例如:

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

然后,上述lambda符合
void命令(对象参数)
要求。

命令执行结果可能是事件

例如:

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...
    }
}
类changename命令
{
内部id;
字符串\u名称;
i存储库;
IEventPublisher(出版商);
public ChangeNameCommand(int-id、字符串名、IRepository存储库、IEventPublisher发布者)
{
_id=id;
_名称=名称;
_存储库=存储库;
_publisher=publisher;
}
public void Execute()
{
User User=\u repository.Get(\u id)
user.Name=\u Name;
_保存(用户);
NameChangedEvent e=新的NameChangedEvent();
_出版商:出版(e);
}
}
类用户名已更改:IHandler
{
公共无效句柄(NameChangedEvent e)
{
//待办事项。。。
}
}

例如,我创建了一个类StringResponse:ICommandResponse{Type ResponceType{get{return typeof(String);}}}}….}@Virviil,这就是lambda的用途,它们是对您的命令的包装,而不是无效的。