(空)接口的用法总结
接口用于定义某个类的特定能力或特性。在工作流或任务管理系统中,接口可以帮助标识哪些任务可以在特定阶段执行。通过实现这些接口,任务类可以被标识为在相应的阶段可以执行,从而在验证和执行逻辑中进行类型检查。
1. 接口定义(空接口,用来做标签)
定义两个接口,分别用于标识任务。举例如下,在暂停/恢复阶段和完成阶段的可执行性。
namespace MyApp.Workflow.Commands
{public interface ICanRunInPauseResumePhase{}public interface ICanRunInCompletionPhase{}
}
2. 实现接口的任务类
创建一个任务类,实现上述接口,以表明该任务可以在相应的阶段执行。
using MyApp.Workflow.Commands;namespace MyApp.Workflow.Commands.Processing
{public class DataProcessingTask : Task, ICanRunInPauseResumePhase, ICanRunInCompletionPhase{public DataInput InputData { get; } = new(nameof(InputData));public override void Start(ITaskExecutionContext context){// 执行数据处理逻辑InputData.Process(context);}public override List<Error> Validate(ITaskExecutionContext context){List<Error> errors = new List<Error>();if (!InputData.IsValid()){var error = new Error(ErrorSeverity.Critical,context.Thread,this,"INVALID_INPUT_DATA",InputData.Value == null ? string.Empty : InputData.Value);errors.Add(error);}return errors;}public override List<IInput> Inputs() =>new List<IInput>() { InputData };}
}
3. 验证任务的有效性
在验证任务的逻辑中,使用接口来检查任务是否可以在特定阶段执行。为了利用接口Interface,这里,可以用泛型 或者模板的方式,
private static bool CanTaskBeUsedInPhase<TRequiredTaskInterface>(Task task,ITaskExecutionContext context,List<Error> errors,string errorMessage,Task taskToAssignError)where TRequiredTaskInterface : class
{if (task is TRequiredTaskInterface){return true;}errors.Add(new Error(ErrorSeverity.Critical,context.Thread,taskToAssignError,errorMessage));return false;
}
4. 在工作流中使用
在工作流的执行过程中,根据任务是否实现了这些接口来决定是否执行该任务。
if (!CanTaskBeUsedInPhase<ICanRunInCompletionPhase>(task, context, errors, "Task not allowed in this phase", taskToAssignError))
{continue;
}
总结
- 接口用于标识任务在特定阶段的可执行性。 空接口,可以赋予属性标签。
- 通过实现接口,任务类可以被标识为在相应的工作流阶段可以执行。
- 在验证和执行任务时,可以使用接口进行类型检查,以确保任务在适当的阶段被调用