private void InitApproveFlow(ApproveFlowInitContext context) { var beforePipeLineBuilder = InitBeforePipeLine(); var handlingPipeLineBuilder = InitHandlingPipeLine(); var afterPipeLineBuilder = InitAfterPipeLine(); RegisterEntityPipeLine(context.flowType, beforePipeLineBuilder, handlingPipeLineBuilder, afterPipeLineBuilder); var beforePipeLine = beforePipeLineBuilder.Build(); var handlingPipeLine = handlingPipeLineBuilder.Build(); var afterPipeLine = afterPipeLineBuilder.Build(); beforePipeLine.Invoke(context); handlingPipeLine.Invoke(context); afterPipeLine.Invoke(context); }
其中,RegisterEntityPipLine()方法根据flowType动态加载对应的类,所有类继承了一个公共的接口,接口暴露出了Handle方法。
private void RegisterEntityPipeLine(string flowType, IPipeLineBuilder<ApproveFlowInitContext> beforePipeLineBuilder, IPipeLineBuilder<ApproveFlowInitContext> handlingPipeLineBuilder, IPipeLineBuilder<ApproveFlowInitContext> afterPipeLineBuilder) { var handleClassName = ("类名的前缀" + flowType).ToLower(); var type = AppDomain.CurrentDomain.GetAssemblies() .Where(a => a.FullName.Contains("程序及名称")) .SelectMany(a => a.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(类继承的接口名称)) ) ).FirstOrDefault(u => u.FullName != null && u.Name.ToLower() == handleClassName ); if (type == null) throw new ObjectNotFoundException("未找到名称为[" + handleClassName + "]的类"); var handle = (类继承的接口名称)_serviceProvider.GetService(type); handle.Handle(beforePipeLineBuilder, handlingPipeLineBuilder, afterPipeLineBuilder); }
Handle方法里面又做了什么呢?
public void Handle(IPipeLineBuilder<ApproveFlowInitContext> beforePipeLineBuilder, IPipeLineBuilder<ApproveFlowInitContext> handlingPipeLineBuilder, IPipeLineBuilder<ApproveFlowInitContext> afterPipeLineBuilder) { HandleBefore(beforePipeLineBuilder); Handling(handlingPipeLineBuilder); HandleAfter(afterPipeLineBuilder); }
分别向三个管道中添加 前、中、后 对应的任务。
Q&A
Q1:如果处理任务依赖于上一个处理任务的处理结果怎么办?
PipeLineDelegate<TContext> 中的TContext是一个对象,可以向该对象中添加对应的属性,上游任务处理任务并对Context中的属性赋值,供下游的任务使用。
Q2:如果某一个任务需要在其他任务之前执行怎么办(需要插队)?
PipeLineBuilder.Use() 中,有Index参数,可以通过该参数,指定插入任务的位置。
Q3:如果保证管道的通用性(不局限于某一业务)?
TContext是泛型,可以不同的任务创建一个对应的TContext即可实现不同业务下的PipleLine的复用。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
您可能感兴趣的文章: