.Net Core服务注册和中间件介绍
在讲这两个之前,首先我们先了解下请求在到达Controller之前,都在做什么?
其实在做的一件最重要的事情就是管道的构建。
整个请求的大概流程是这样的:在发起请求后,请求被Kestrel监听到,并且被接收并处理成HttpContext,HttpContext在整个管道里面是被共享的,也就是说,这是个管道中对HttpContext的各种修改都是针对的同一个HttpContext,那么 这个管道里面到底发生了什么呢?
准备知识:建造者模式:一种设计模式,旨在讲一个复杂的对象抽象出来,分步构建。举例来说,我们要构建一个学校对象,但是这个学校对象非常复杂,他不仅有学生类,教师类,教学楼分更这些基础类,还有一些学习方法,教学方法,上课流程方法。学习方法里面又存在不同学科的学习流程,不同的学科又有不同的学期等等,总之要想构建出来这个学校非常复杂,而且有些东西比如没有物理化学这些学科等我们不需要构建,但是可能别人需要,这又衍生出来许多问题,使这个学校构建更加复杂,于是我们可以通过抽象出来这个学校对象,学校对象里面的所有类行为都各自实现,我们只提供统一的外部抽象类XXXBuilder,通过XXXBuilder我们构建我们需要的东西,我们需要学生就配置学生XXXBuilder.AddStudent(op => { op.Styduy() }),这样 对于外部使用者来说就非常方便了。等全部配置完成再调用Build()方法构建出学校这个对象。
构建管道是一个很复杂的过程,core通过建造者模式创建了一个builder = new WebApplacationBuilder(), 通过builder 初始化和配置一些东西,IOC注册服务等完成这个builder 的构建,最后调用Build()得到WebApplication这个对象, WebApplication就是我们的应用程序对象。之后我们就可以对这个WebApplication再配置一些中间件,形成管道,最后调用Run()启动Kestrel服务器监听请求,整个流程就告一段落了。
这里其实有两个最重要的部分,一个是IOC的注册,一个就是中间件管道的构建。
1.IOC注册:
IOC-控制反转,依赖注入就是实现IOC的一种方式,一般来说我们程序的生命周期也就是说IOC注册的生命周期有三种:瞬时,作用域,单例。
瞬时:每次请求该类型,都会创建一个新的实例出来。
作用域:每次http请求,只会生成一个实例。
单例:整个应用程序都只会生成一个实例,全局唯一。
注册服务其实就是创建出来一个ServiceCollection集合,ServiceCollection里面包含着你注册的所有服务。
2.中间件:
中间件是针对builder.Build()之后生成的app添加一些组件,这些中间件其实就是一个个委托,通常用表示为RequestDelegate。中间件是构成管道的关键,也可以说中间件组成管道。在一个请求被kestrel监听并接收后,这个请求被处理成HTTPContext,HTTPContext就会经过一系列中间件到达Controller。在这个过程中,每个中间件都可以处理这个HTTPContext,并对这个请求进行拦截返回或者传递给下一个中间件,所以每个中间件,也就是RequestDelegate都在中间件链中作为委托来调用下一个中间件

浙公网安备 33010602011771号