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

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

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

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

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

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

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

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

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

Я говорю "перевернутый" конвейер, потому что вместо перехода от A к Z I я бы хотел проверить, какие этапы мне нужны, начиная с 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);

}

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

2 ответа

Решение

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

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

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

Определение

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

Другие вопросы по тегам