利用Asp.Net Core的MiddleWare思想如何处理复杂业务流(2)

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的复用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdsxfs.html