Перевернутый конвейер / цепочка ответственности
Мне интересно, существует ли шаблон установления для управления потоком, который будет иметь мое приложение.
Проще говоря, это должно быть что-то вроде этого:
- Пользователь предоставляет файл
- Файл обрабатывается
- Пользователь получает обработанный файл
Будет несколько этапов обработки, скажем, 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 являются этапами, и потоки могут быть определены путем направления исходящих сообщений в разные очереди.
Определение
Прикрепите дополнительные обязанности к объекту динамически. Декораторы предоставляют гибкую альтернативу подклассам для расширения функциональности.