Wpf 指挥模式及;参数设计
我对命令模式的理解是,您只需要有一个虚拟方法“execute()”,实现可能具有的所有依赖项都放在构造函数中,或者通过setter注入到实现中(如前所述) 但是,在该模式的WPF实现中,我注意到它们正在向execute()函数传递一个泛型参数(已解释)Wpf 指挥模式及;参数设计,wpf,design-patterns,command-pattern,Wpf,Design Patterns,Command Pattern,我对命令模式的理解是,您只需要有一个虚拟方法“execute()”,实现可能具有的所有依赖项都放在构造函数中,或者通过setter注入到实现中(如前所述) 但是,在该模式的WPF实现中,我注意到它们正在向execute()函数传递一个泛型参数(已解释) 对我来说,这似乎是对接口的污染,在execute()函数中添加泛型参数的动机是什么?它是用于数据绑定的。例如,当您将命令绑定到列表中的每个对象时,当前实例将被发送到execute方法,这样您就不必自己跟踪当前实例 也就是说,我不认为WPF命令概念
对我来说,这似乎是对接口的污染,在execute()函数中添加泛型参数的动机是什么?它是用于数据绑定的。例如,当您将命令绑定到列表中的每个对象时,当前实例将被发送到execute方法,这样您就不必自己跟踪当前实例
也就是说,我不认为WPF命令概念是命令模式的实现,它们只是共享术语。该参数背后的原因是命令的创建者之间的隔离,他们知道需要执行什么命令,调用方知道何时需要执行命令 在某些命令中,创建者无法获得执行所需的某些信息。调用方通过传递一个参数来填充空白。例如:创建者创建一个命令,根据某些条件过滤记录列表。该列表在创建站点不可用,因为应用程序中有多种列表
调用者将通过将at作为参数传递来指定需要过滤的列表。我们使用稍微改变的命令模式,因此,除了Execute方法外,我们还有两个属性Request和Response,并使用多态性对它们进行参数化。规范的命令模式通常用漂亮的自包含命令来说明。命令所需的任何信息都隐藏在命令对象实例中(通常通过参数化构造函数) 但是,在某些情况下,执行所需的参数可能在命令创建时不可用(仅在运行时已知)。e、 g.想象一个
SignOutCommand(用户名)
。用户名是在用户首次登录后单击“注销”按钮时确定的
因此,用户名作为通用参数传递给Command.Execute()
;每个命令都可以自由定义其输入并相应地强制转换,例如,任意命令可能需要5个参数作为对象[]。有什么问题:
public class DeleteCommand : BaseCommand
{
private Dictionary<string, object> parameters;
public DeleteCommand(Dictionary<string, object> parameters)
{
this.parameters = parameters;
}
public void Execute()
{
var person = (Person)parameters["Person"];
var salary = System.Convert.ToDouble(parameters["Salary"]);
// etc.
}
}
公共类DeleteCommand:BaseCommand
{
私有字典参数;
公共删除命令(字典参数)
{
此参数=参数;
}
public void Execute()
{
var person=(person)参数[“person”];
var salary=System.Convert.ToDouble(参数[“salary”]);
//等等。
}
}
现在,如果您有一个收集参数的控制器,您可以将这些参数传递给您的命令 在您的示例中,我希望为处理列表的命令提供一个特定的接口,该接口将列表(或列表的接口)作为参数,而不是某种通用参数。@eli.work:我没有说参数需要是通用的。我刚才说,在创建命令对象的站点上,执行所需的数据并不总是可用的。我的问题应该更清楚一点:我想知道的是泛型参数的动机。我会更新我的问题,谢谢你的回复!我明白了,但是为什么不定义一个单独的接口,或者创建一个从其他地方获取用户名的命令实现(比如IUserNameGetter)?@eli.work我想这是简单和优雅之间的折衷。使用IUserNameGetter,您必须创建此新类型的实例并将其存储在命令对象中。每次执行调用时,命令对象都会再次发送一条消息,从GUI检索用户名。比仅仅传递输入更健谈。另外,由于WPF限制从创建GUI的线程访问GUI,您可能需要在IUserNameGetter impl中执行线程验证和切换(例如,如果在工作线程上调用Command.Execute)。我在编写的测试自动化框架中使用了类似的方法,尽管我正在将字典传递给Execute方法,以便操作对象可以保持无状态,因此可以缓存。