0

我创建了由进程和任务(不是 .NET API 类)组成的小型框架组件。

进程可以包含多个任务。

现在在一个流程中,有一个参数列表应该可用于每个任务。

要求是
1. 任务应该来自 DI
2. 参数列表由 Process 拥有,并且应该可用于所有任务。任务会读取参数,也可以添加一些参数

Current Implementation -> Initialize 方法在 BaseTask(所有任务从其派生)和 BaseProcess(所有进程从其派生)中指定。这接受参数列表作为参数。

有没有针对此类问题的设计模式?

4

1 回答 1

0

您还可以为您的任务使用工厂,而不是将任务直接嵌入到流程中。最简单的形式是委托:

public class Process {

  private readonly List<Func<Process, BaseTask>> TaskFactories
    = new List<Func<Process, BaseTask>>();

  public RegisterTask(Func<Process, BaseTask> taskFactory)
  {
    TaskFactories.Add(taskFactory);
  }

  public IEnumerable<Task> CreateTasks() {
    return TaskFactories.Select(f => f(this)).ToArray();
    //ToArray used to ensure all tasks created here and now.
  }

}

这样您就可以编写这样的任务:

public class MyTask : BaseTask { 
  public MyTask(Process p) {
    /* grab parameters from process here */
  }
}

然后你可以注册这个任务,给定Process p这样的:

public void RegisterSomeTask(Process p) {
  p.RegisterTask((process) => new MyTask(p));
}

这也消除了对Initialize方法的需求,在我看来,这绝不是一个理想的模式,因为除非您的状态管理绝对成功,否则可能会有一个未初始化的任务会引发错误。

于 2012-12-21T08:50:57.590 回答