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