Перевернутый шаблон конвейера/цепочки ответственности

Мне интересно, существует ли шаблон установки для управления потоком, который будет иметь мое приложение.

Проще говоря, это должно быть что-то вроде этого:

  • Пользователь предоставляет файл
  • Файл обрабатывается
  • Пользователь получает обработанный файл

Будет несколько этапов обработки, скажем, PreprocessingOne, PreprocessingTwo, PreprocessingThree и FinalProcessing.

Естественно, мы не контролируем файлы, которые предоставляет пользователь — они потребуют разного количества шагов предобработки.

Поскольку мои службы обработчиков сообщений будут находиться в отдельных API-интерфейсах, я не хочу вызывать их только для того, чтобы вернуть «Невозможно обработать» или «Не требует обработки» из соображений производительности.

Точно так же я не хочу передавать загруженный файл между службами.

В идеале я хотел бы спроектировать поток для файла динамически, оценивая содержимое и вставляя только те обработчики сообщений, которые имеют смысл.

Я говорю «перевернутый» конвейер, потому что вместо перехода от A к Z я бы предпочел проверить, какие этапы мне нужны, начиная с Z, и вставить только последние.

Таким образом, если загруженный файл сразу соответствует FinalProcessing, поток будет состоять только из одного элемента.

Если файл требует перехода от PreprocessingTwo, тогда поток будет PreprocessingTwo > PreprocessingThree > FinalProcessing

Итак, я подумал, что могу реализовать что-то подобное, но я не уверен в деталях.

public interface IMessageHandler
   {
    void Process(IFile file);
   }


public interface IContentEvaluator 
{
     IList<IMessageHandler> PrepareWorkflow(IFile file);
}

public interface IPipelineExecutor
{
        void ExecuteWorkflow(IList<IMessageHandler> workflow, IFile file);
   }

А потом в приложении

public void Start(IFile newFile)
{
    var contentEvaluator = new ContentEvaluator(this.availableHandlers); // would be DI
    var workflow = contentEvaluator.PrepareWorkflow(newFile);
    this.executor.ExecuteWorkflow(workflow, newFile);

}

Не могли бы вы посоветовать, порекомендовать какой-то подход или прочитать дальше?


person Bartosz    schedule 10.05.2017    source источник


Ответы (2)


Вы можете рассмотреть возможность использования шаблона Стратегия: ...выбирает алгоритм в время выполнения...
Но если у вас слишком много комбинаций потока, то количество стратегий, которые необходимо реализовать, увеличится, и решение может быть сложным.

Другой подход может заключаться в использовании SEDA: ...декомпозирует сложный, управляемый событиями приложение в набор этапов, соединенных очередями...
PreprocessingOne, PreprocessingTwo, PreprocessingThree и FinalProcessing — это этапы, а потоки могут быть определены путем направления исходящих сообщений в разные очереди.

person dstar55    schedule 10.05.2017

Это шаблон декоратора

Определение

Динамически прикрепляйте дополнительные обязанности к объекту. Декораторы предоставляют гибкую альтернативу подклассам для расширения функциональности.

person Neil    schedule 10.05.2017