c# - 执行责任链变化

标签 c# linq c#-4.0 chain-of-responsibility

我有一个任务管道,基本上是责任链模式的变体。

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

internal interface IPTask<T>
{
    bool CanExecute(T instance);
    T Process(T instance);
}

..我的处理器看起来像

internal interface IProcessor<T>
{
    T Execute(T instance);
}

我的具体实现是这样的:

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;
    }
}

..我的任务是这样的:

internal interface ITasks<T>
{
    IEnumerable<IPTask<T>> GetTasks();
}

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

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

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

你能帮我搞定这个吗?此外,您是否希望为此目的对代码进行不同的结构化?

最佳答案

这个怎么样:

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

         result = individual.Process(result);
     }

     return result;
}

正如您目前所拥有的那样,它更像是一种复合模式,而不是责任链。此更改使其更像 CoR。但是注意它是否满足您的需求比使用正确的设计模式行话更重要。 :)

关于c# - 执行责任链变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11143637/

相关文章:

c# - 获取输出数据返回 0

c# - 如何使用 Gekofx 浏览器使用 c# 调用 javascript 函数

c# - 使用 GroupBy 计算对象列表中具有相同属性值的对象

LINQ 查询检查是否为空

c# - 如何从基于 OnMethodBoundaryAspect 的日志记录中排除?

c# - 如何使用数据库在mvc3中的jquery中显示确认框

linq - AD0.NET Entity Framework 4.0 或 Linq-to-SQL

c# - 将 XElement 添加到特定位置的另一个 XElement

Java Future 与 C# async await

c# - Visual Studio 不再显示代码中的错误