ICommand - 我应该在Execute中调用CanExecute吗?

She*_*tin 15 c# wpf command design-patterns

鉴于System.Windows.Input.ICommand为2个主要方法:

interface ICommand {
  void Execute(object parameters);
  bool CanExecute(object parameters);
  ...
}
Run Code Online (Sandbox Code Playgroud)

我希望在调用Execute(...)之前在Command支持的框架中调用CanExecute(...).

但是,在我的Command实现的内部,是否有任何理由在我的Execute(...)实现中添加CanExecute(...)调用?

例如:

public void Execute(object parameters){
  if(!CanExecute(parameters)) throw new ApplicationException("...");
  /** Execute implementation **/
}
Run Code Online (Sandbox Code Playgroud)

这在我的测试中变得相关,因为我可能会模拟一些支持CanExecute的接口,并且在测试Execute时必须执行相同的模拟.

对此有何设计想法?

Siy*_*ams 7

众所周知程序员是懒惰的,他们会在Execute没有CanExecute先打电话的情况下打电话.

ICommand接口更常用于WPF绑定框架,但它是一种非常强大且有用的模式,可以在其他地方使用.

CanExecute立即从Execute方法调用以验证对象的状态.它有助于减少重复逻辑并强制使用该CanExecute方法(为什么要经历所有努力,无论他们是否可以调用方法而不是强制执行它?).我没有看到CanExecute多次调用的问题,因为无论如何它应该是一个快速操作.

但是,Execute如果CanExecute方法返回false,我总是记录调用方法的结果,以便消费者知道后果.