东莞企业公司网站建设,手机网页制作图片,全文全网收录查询,企业数据最近利用Asp.Net Core 的MiddleWare思想对公司的古老代码进行重构#xff0c;在这里把我的设计思路分享出来#xff0c;希望对大家处理复杂的流程业务能有所帮助。背景一个流程初始化接口#xff0c;接口中根据传入的流程类型#xff0c;需要做一些不同的工作。1.有的工作是… 最近利用Asp.Net Core 的MiddleWare思想对公司的古老代码进行重构在这里把我的设计思路分享出来希望对大家处理复杂的流程业务能有所帮助。背景一个流程初始化接口接口中根据传入的流程类型需要做一些不同的工作。1.有的工作是不管什么类型的流程都要做的共有有的工作是某一流程特有的。2.各个处理任务基本不存在嵌套关系所以代码基本是流水账式的。3.流程的种类较多代码中if或者switch判断占了很大的篇幅。4.这些处理工作大致可分为三大类前期准备工作参数的校验等处理中的工作更新数据库插入数据等扫尾工作日志记录通知等Asp.Net Core中的MiddleWare注意第二条流水账式的代码这让我想到《管道模型》而Asp.Net Core的MiddleWare正是放在这个管道中的。看下图有middleware1,middleware2,middleware3这三个中间件放在一个中间件的集合PipeLine管道中并有序排列Request请求1从流向2载流向3随之产生的Response从底层依此流出。这个Request和Resopnse就封装在我们经常看到的Context上下文中Context传入到中间件1中间件1处理后再传出Context给中间件2 一直这样传出去直到传到最后一个。我们经常在startup的configure中调用的app.use()方法其实也就是向这个集合中添加一个middleware,Context进入后必须被该middleware处理。不知道我这么说大家有没有这种管道模型处理任务的概念了代码解读不懂没关系那我们结合代码看看。上面说过每个MiddleWare会把Context从自己的身体里面过一遍并主动调用下一个中间件。所以中间件是什么 是一个传入是Context,传出也是Context的方法吗不是是一个传入是委托传出也是委托而这传入传出的委托的参数是Context,该委托如下/// summary /// 管道内的委托任务 /// /summary /// param namecontext/param /// returns/returns public delegate Task PipeLineDelegatein TContext(TContext context);所以中间件是下面这样的一个Func它肩负起了调用下一个中间件委托的重任FuncPipeLineDelegateTContext, PipeLineDelegateTContext而管道又是什么呢 是Func的集合如下IListFuncPipeLineDelegateTContext, PipeLineDelegateTContext _components new ListFuncPipeLineDelegateTContext, PipeLineDelegateTContext();我们再Startup方法里面的Configure方法里面的Use是在做什么呢其实就是在给上面的管道_components添加一个func,如下但是在今天的Use中呢我还想对原有的Use进行一次重载如下可以看到重载之后传入的变成了ActionTContext action因为我想外部专注于自己要真正处理的业务而调用下一个middleware的事情封装到方法内部不用外部来关心了并且可以通过传入的index指定插入的中间件的位置以此来控制业务的执行顺序。 最后需要把传入的委托链接起来这就是管道的Build工作代码如下到这里管道相关的差不多说完了那我我如何利用上面的思想来处理我的业务呢 处理业务 处理示意图步骤Ø 初始化三条处理管道根本是New三个ListTask集合对应前期准备工作集合处理中工作的集合扫尾工作的集合。Ø 向三条管道中注入公共的处理任务。Ø 根据传入的流程类型动态加载对应的处理方法Handle()。Ø Handle方法向三条管道中注入该类型的流程所对应的特有任务。Ø Build三条管道。Ø 依此执行准备工作管道处理中管道处理后管道。上面步骤可以概括成下面的代码。其中RegisterEntityPipLine()方法根据flowType动态加载对应的类所有类继承了一个公共的接口接口暴露出了Handle方法。Handle方法里面又做了什么呢分别向三个管道中添加 前、中、后 对应的任务。QAQ1:如果处理任务依赖于上一个处理任务的处理结果怎么办PipeLineDelegateTContext 中的TContext是一个对象可以向该对象中添加对应的属性上游任务处理任务并对Context中的属性赋值供下游的任务使用。Q2:如果某一个任务需要在其他任务之前执行怎么办需要插队PipeLineBuilder.Use() 中有Index参数可以通过该参数指定插入任务的位置。Q3:如果保证管道的通用性不局限于某一业务TContext是泛型可以不同的任务创建一个对应的TContext即可实现不同业务下的PipleLine的复用。 有什么上面没涉及的问题欢迎大家在下方留言提问谢谢。原文地址https://www.cnblogs.com/CoderAyu/p/9452444.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com