Выполнение варианта цепочки ответственности

У меня есть конвейер задач, который в основном представляет собой вариант шаблона цепочки ответственности.

Задача в моем конвейере выглядит так, как показано ниже

internal interface IPTask<T>
{
    bool CanExecute(T instance);
    T Process(T instance);
}

... и мой процессор выглядит так:

internal interface IProcessor<T>
{
    T Execute(T instance);
}

и моя конкретная реализация выглядит так:

public class Processor<T> : IProcessor<T>
{
    private readonly ITasks<T> tasks;

    public Processor(ITasks<T> tasks)
    {
        this.tasks= tasks;
    }

    public T Execute(T instance)
    {
         var taskstoExecute = tasks.GetTasks()
                                   .Where(task => task.CanExecute(instance));

         taskstoExecute.ToList().ForEach(task=>task.Process(instance));

         return T;
    }
}

..и мои задачи выглядят так:

internal interface ITasks<T>
{
    IEnumerable<IPTask<T>> GetTasks();
}

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

Теперь, как вы видите, я выполняю все задачи в конвейере, я хотел бы изменить это следующим образом:

  • Вход для Метод Executeдля следующей задачи должен быть из ранее выполненной задачи.
  • Если CanExecuteдля задачи завершается сбоем, конвейер должен прекратить обработку задач.

Не могли бы вы помочь меня в получении этого Также вы ожидаете, что код будет структурирован по-другому для этой цели?

5
задан Mike 22 June 2012 в 07:42
поделиться