命令行编译 - c#返回值




命令模式:如何将参数传递给命令? (8)

DeletePersonCommand可以在其构造函数或方法中包含参数。 DeletePersonCommand将具有Execute()和执行可以检查属性,该属性将由Getter / Setter先前调用Execute()。

我的问题与命令模式有关,我们有以下抽象(C#代码):

public interface ICommand
{
    void Execute();
}

让我们来看一个简单的具体命令,它旨在从我们的应用程序中删除一个实体。 例如,一个Person实例。

我将有一个DeletePersonCommand ,它实现了ICommand 。 此命令需要Person作为参数删除,以便在调用Execute方法时将其删除。

管理参数化命令的最佳方法是什么? 在执行参数之前如何将参数传递给命令?


在创建命令对象时传递此人:

ICommand command = new DeletePersonCommand(person);

这样当你执行命令时,它已经知道它需要知道的一切。

class DeletePersonCommand : ICommand
{
   private Person person;
   public DeletePersonCommand(Person person)
   {
      this.person = person;
   }

   public void Execute()
   {
      RealDelete(person);
   }
}

在这种情况下,我们对Command对象所做的就是创建一个Context对象,它本质上是一个map。 映射包含名称值对,其中键是常量,值是Command实现使用的参数。 如果您有一个命令链,后面的命令依赖于先前命令的上下文更改,则特别有用。

所以实际的方法就变成了

void execute(Context ctx);

您应该创建一个CommandArgs对象以包含要使用的参数。 使用Command对象的构造函数注入CommandArgs对象。


我会向DeletePersonCommand的构造函数添加任何必要的参数。 然后,当调用Execute()时,使用在构造时传递到对象的那些参数。


我的实现是这样的(使用Juanma提出的ICommand):

public class DeletePersonCommand: ICommand<Person>
{
    public DeletePersonCommand(IPersonService personService)
    {  
        this.personService = personService;
    }

    public void Execute(Person person)
    {
        this.personService.DeletePerson(person);
    }
}

IPersonService可以是一个IPersonRepository,它取决于你的命令是什么“层”。


根据C#/ WPF中的模式,ICommand接口(System.Windows.Input.ICommand)被定义为将对象作为Execute的参数以及CanExecute方法。

interface ICommand
            {
                bool CanExecute(object parameter);
                void Execute(object parameter);
            }

这允许您将命令定义为静态公共字段,该字段是实现ICommand的自定义命令对象的实例。

public static ICommand DeleteCommand = new DeleteCommandInstance();

通过这种方式,在调用execute时传入相关对象(在您的情况下是一个人)。 然后,Execute方法可以转换对象并调用Delete()方法。

public void Execute(object parameter)
            {
                person target = (person)parameter;
                target.Delete();
            } 

让“Person”实现某种IDeletable接口,然后使命令采用您的实体使用的任何基类或接口。 这样,您可以创建一个DeleteCommand,它尝试将实体强制转换为IDeletable,如果可行,则调用.Delete

public class DeleteCommand : ICommand
{
   public void Execute(Entity entity)
   {
      IDeletable del = entity as IDeletable;
      if (del != null) del.Delete();
   }
}




design-patterns