主页 > www.599899.com >
Core 运行原理解剖[2]:Hosting补充之配置介绍
发布日期:2019-09-10 12:58   来源:未知   阅读:

  在上一章ASP.NET Core 运行原理解剖[1]:Hosting中,我们介绍了 ASP.NET Core 的启动过程,主要是对源码的探索。而本文则是对上文的一个补充,更加偏向于实战,详细的介绍一下我们在实际开发中需要对

  WebHostBuild 用来构建 WebHost ,也是我们最先接触的一个类,它提供了如下方法:

  而我们比较熟悉的当前执行环境,也是通过该_config来读取的,虽然我们不能配置它的数据源,但是它为我们提供了一个UseSetting方法,为我们提供了一个设置_config的机会:

  UseStartup 这个我们都比较熟悉,它用来显式注册我们的Startup类,可以使用泛性,Type , 和程序集名称三种方式来注册:

  具体的注册方式,在 上一章 也介绍过,就是通过反射创建实例,然后注入到 DI 系统中。

  WebHostBuild 中还有很多配置的方法,就不再一一细说,在这里简单介绍一下:

  ISartup 是我们比较熟悉的,因为在我们创建一个默认的 ASP.NET Core 项目时,都会有一个Startup.cs文件,包含三个约定的方法,按执行顺序排列如下:

  ASP.NET Core 框架本身提供了一个 DI(依赖注入)系统,并且可以非常灵活的去扩展,很容易的切换成其它的 DI 框架(如 Autofac,Ninject 等)。在 ASP.NET Core 中,所有的实例都是通过这个 DI 系统来获取的,并要求我们的应用程序也使用 DI 系统,以便我们能够开发出更具弹性,更易维护,测试的应用程序。总之在 ASP.NET Core 中,一切皆注入。关于 “依赖注入” 这里就不再多说。

  在 DI 系统中,想要获取服务,首先要进行注册,而ConfigureServices方法便是用来注册服务的。

  虽然 ASP.NET Core 自带的 DI 系统只提供了构造函数注入,以及不支持命名实例等,但我喜欢它的简洁,并且不太喜欢依赖太多第三库,一直也只使用了内置的DI框架,因此对这个方法也不太了解,就不再多说。

  Configure 接收一个IApplicationBuilder类型参数,而IApplicationBuilder在 上一章 中介绍过,它是用来构建请求管道的,因此,也可以说 Configure 方法是用来配置请求管道的,通常会在这里会注册一些中间件。

  所谓中间件,也就是对HttpContext进行处理的一种便捷方式,下文会详细来介绍。而如上代码,我们注册了一个最简单的中间件,通过浏览器访问,便可以看到 “Hello ASP.NET Core!” 。

  通常,我们的 Startup 类并没有去实现IStartup接口,这是因为我们在Configure方法中,大多时候可能需要获取一些其它的服务,如我刚才注册的IUserService,我们可以直接添加到 Configure 方法的参数列表当中:

  ASP.NET Core 会通过 DI 系统来解析到 userService 实例,但是 ASP.NET Core 中的 DI 系统是不支持普通方法的参数注入的,而是手动通过反射的方式来实现的:

  而通过反射也可以为我们带来更大的灵活性,上面的LoadMethods方法会根据当前的执行环境名称来查找适当的方法名:

  更具体的可以查看 StartupLoader,ASP.NET Core 会根据当前环境的不同,而执行不同的方法:

  如上,当在Development环境上执行时,会选择带Development的方法来执行。

  而在默认模版中是通过UseStartupStartup的方式来注册 Startup 类的,我们也可以使用上面介绍的指定程序集名称的方式来注册:

  如上,我们指定在 EmptyWebDemo 中查找Startup类,这样还有一个额外的好处,WebHost同样会根据当前的执行环境来选择不同的Startup类(如StartupDevelopment),与上面介绍的Startup中方法的查询方式一样。

  上面,我们介绍了Sartup,而一个项目中只能一个Sartup,因为如果配置多个,则最后一个会覆盖之前的。而在一个多层项目中,Sartup类一般是放在展现层中,我们在其它层也需要注册一些服务或者配置请求管道时,通常会写一个扩展方法:

  感觉这种方式非常丑陋,而在上一章中,我们知道 WebHost 会在 Starup 这前调用IHostingStartup,于是我们便以如下方式来实现:

  它只有一个Configure方法,是对 Starup 类中Configure方法的,给我们一个在Configure方法执行之前进行一些配置的机会。

  当我们希望随着 ASP.NET Core 的启动,来执行一些后台任务(如:定期的刷新缓存等)时,并在 ASP.NET Core 停止时,可以优雅的关闭,则可以使用IHostedService,它有如下定义:

  如上,我们定义了一个在台后每5秒刷新一次缓存的服务,并在 ASP.NET Core 程序停止时,优雅的关闭。最后,将它注册到 DI 系统中即可:

  IApplicationLifetime已被 ASP.NET Core 注册到 DI 系统中,我们使用的时候,只需要注入即可。它有三个CancellationToken类型的属性,是异步方法终止执行的信号,表示 ASP.NET Core 生命周期的三个阶段:启动,开始停止,已停止。

  在上一章中我们提到过, IApplicationLifetime 的启动信号是在WebHost的StartAsync方法中触发的,而没有提到停止信号的触发,在这里补充一下:

  本文详细介绍了对 WebHost 的配置,结合 上一章,对Core 的启动流程也基本清楚了,下一章就来介绍一下请求管道的创建,敬请期待!