执行责任链变更

Mik*_*ike 5 c# linq chain-of-responsibility c#-4.0

我有一系列任务,基本上是责任链模式的变体.

我的管道中的任务如下所示

internal interface IPTask<T>
{
    bool CanExecute(T instance);
    T Process(T instance);
}
Run Code Online (Sandbox Code Playgroud)

..和我的处理器看起来像

internal interface IProcessor<T>
{
    T Execute(T instance);
}
Run Code Online (Sandbox Code Playgroud)

我的具体实现如下:

public class Processor<T> : IProcessor<T>
{
    private readonly ITasks<T> tasks;

    public Processor(ITasks<T> tasks)
    {
        this.tasks= tasks;
    }

    public T Execute(T instance)
    {
         var taskstoExecute = tasks.GetTasks()
                                   .Where(task => task.CanExecute(instance));

         taskstoExecute.ToList().ForEach(task=>task.Process(instance));

         return T;
    }
}
Run Code Online (Sandbox Code Playgroud)

..我的任务看起来像这样:

internal interface ITasks<T>
{
    IEnumerable<IPTask<T>> GetTasks();
}
Run Code Online (Sandbox Code Playgroud)

T可以是不同的实例,但受通用合同的约束.其中一项任务是将传入对象映射到完全不同的对象,并从那里转发该实例.

现在正如您所看到的,我正在执行管道中的所有任务,我想将其修改为以下内容:

  • Execute下一个任务的方法输入应来自先前执行的任务.
  • 如果CanExecute任务失败,则管道应停止处理任务.

能不能帮我解决这个问题.您是否还希望代码的结构不同以达到此目的?

tal*_*eth 3

这个怎么样:

public T Execute(T instance)
{
     T result = instance;
     foreach(var individual in tasks.GetTasks())
     {
         if(!individual.CanExecute()) break;

         result = individual.Process(result);
     }

     return result;
}
Run Code Online (Sandbox Code Playgroud)

正如您目前所拥有的,它更像是复合模式而不是责任链。这一变化使其变得更加 CoR 风格。但更重要的是注意它是否满足您的需求,而不是使用正确的设计模式术语。:)