Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反向管道/责任链模式_C#_Design Patterns_Pipeline_Chain Of Responsibility - Fatal编程技术网

C# 反向管道/责任链模式

C# 反向管道/责任链模式,c#,design-patterns,pipeline,chain-of-responsibility,C#,Design Patterns,Pipeline,Chain Of Responsibility,我想知道是否有一个建立模式来控制我的应用程序将拥有的流 简单地说,应该是这样的: 用户提供一个文件 文件正在处理中 用户收到已处理的文件 比如说,将有几个处理步骤 预处理一、预处理二、预处理三和最终处理 当然,我们不控制用户提供的文件-它们将需要不同数量的预处理步骤 因为我的消息处理程序服务将在单独的API中,所以我不想调用它们只是为了返回“还不能处理”或“不需要处理”的性能原因 同样,我不想在服务之间传递上传的文件 理想情况下,我希望通过评估内容并仅插入有意义的消息处理程序来动态设计文件流

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

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

  • 用户提供一个文件
  • 文件正在处理中
  • 用户收到已处理的文件
比如说,将有几个处理步骤 预处理一、预处理二、预处理三和最终处理

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

因为我的消息处理程序服务将在单独的API中,所以我不想调用它们只是为了返回“还不能处理”或“不需要处理”的性能原因

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

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

我说的是“反向”管道,因为我不想从A到Z,而是想检查需要从Z开始的阶段,只插入最后一个阶段

因此,如果上传的文件立即符合
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);
   }
请您提出建议、推荐一些方法或进一步阅读好吗?

这是

定义

将其他职责动态附加到对象。 装饰器提供了一种灵活的替代子类化的方法来扩展 功能

那是一辆汽车吗

定义

将其他职责动态附加到对象。 装饰器提供了一种灵活的替代子类化的方法来扩展 功能

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

另一种方法是使用:…将复杂的事件驱动应用程序分解为一组由队列连接的阶段…
预处理一、预处理二、预处理3和最终处理是阶段,流程可以通过将传出消息定向到不同队列来定义。

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

另一种方法是使用:…将复杂的事件驱动应用程序分解为一组由队列连接的阶段…
预处理一、预处理二、预处理三和最终处理是阶段,可以通过将传出消息定向到不同队列来定义流

public void Start(IFile newFile)
{
    var contentEvaluator = new ContentEvaluator(this.availableHandlers); // would be DI
    var workflow = contentEvaluator.PrepareWorkflow(newFile);
    this.executor.ExecuteWorkflow(workflow, newFile);

}