倒置管道/责任链模式

时间:2017-05-10 12:15:45

标签: c# design-patterns pipeline chain-of-responsibility

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

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

  • 用户提供文件
  • 正在处理文件
  • 用户收到已处理的文件

我们会说有几个处理步骤 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);

}

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

那是decorator pattern

  
    

<强>定义

  
     

动态地将附加职责附加到对象。   装饰器为子类化提供了灵活的替代扩展   功能。