Шаблон команды: выполнение нескольких команд в последовательности - PullRequest
8 голосов
/ 27 августа 2009

Я хочу выпустить серию команд, но только если предыдущая команда была выполнена успешно. Прямо сейчас я поднимаю событие в объекте команды, указывающее, была ли команда успешной или неудачной. Я использую это, чтобы контролировать выполнение, но это чувствует себя не изящным.

Пример:

command1.CommandSucceeded += delegate { command2.Execute(); };
command1.Execute();

Это работает, но кажется неуклюжим и не интуитивным. Я мог бы передать логическое значение на Execute (), указывающее успех или неудачу, но это по тому же пути. Я мог бы генерировать исключения при сбое, что могло бы привести к более чистому коду, но могло бы быть чрезмерным.

Есть предложения?

Ответы [ 2 ]

7 голосов
/ 27 августа 2009

Я справился с этим, настроив команду «цепочка». Я создал объект Command, который содержит другие команды, а затем запускает каждую из них по очереди, когда вызывается Do. В вашем случае вы могли бы заставить команду вызывать делегата и запускать следующую команду в последовательности только в том случае, если она была успешной.

Один из способов сделать это, я полагаю.

1 голос
/ 27 августа 2009

Возвращение логического значения или объекта, представляющего некоторый статус, не так уж и плохо. Это может показаться неуклюжим, но все просто и понятно.

Одна из реализаций, которую я использую, выглядит примерно так:

Сначала я добавляю объекты Command в список.

List<ICommand> commands = new List<ICommand>;
commands.Add(command1);
commands.Add(command2);

Затем список объектов Command выполняется следующим образом:

foreach (ICommand command in commands)
{
  bool success = command.Execute();
  if (!success) break;
}
...