您还可以为您的任务使用工厂,而不是将任务直接嵌入到流程中。最简单的形式是委托:
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
方法的需求,在我看来,这绝不是一个理想的模式,因为除非您的状态管理绝对成功,否则可能会有一个未初始化的任务会引发错误。