职责模式反转pipeline/chain

Inverted pipeline/chain of responsibility pattern

我想知道是否有一个确定的模式来控制我的应用程序将拥有的流程。

简单地说,应该是这样的:

假设有几个处理步骤 PreprocessingOne、PreprocessingTwo、PreprocessingThree 和 FinalProcessing。

自然地,我们不控制用户提供的文件 - 它们需要不同数量的预处理步骤。

由于我的消息处理程序服务将在单独的 API 中,出于性能原因,我不想仅针对 return 'Cannot process yet' 或 'Does not require processing' 调用它们。

同样,我不想在服务之间传递上传的文件。

理想情况下,我想通过评估内容并仅插入有意义的消息处理程序来动态设计文件流。

我说的是 'Inverted' 管道,因为我不想从 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);

}

能否请您提出建议,推荐一些方法或进一步阅读?

那是decorator pattern

Definition

动态地为对象附加额外的职责。 装饰器为扩展子类化提供了一种灵活的替代方案 功能。

您可以考虑使用 Strategy 模式:...在运行时选择算法...
但是,如果您的流程组合太多,那么需要实施的策略数量就会增加,解决方案可能会很复杂。

另一种方法可以使用 SEDA:...将一个复杂的、事件驱动的应用程序分解为一组由队列连接的阶段...
PreprocessingOne、PreprocessingTwo、PreprocessingThree 和 FinalProcessing 是阶段,可以通过将传出消息定向到不同队列来定义流。