我们一致在说 ASP.NET Core广泛地使用到了依赖注入,通过前面两个系列的介绍,相信读者朋友已经体会到了这一点。由于前面两章已经涵盖了依赖注入在管道构建过程中以及管道在处理请求过程的应用,但是内容相对分散和零碎,我们有必要针对这个主题作一个归纳性的介绍。采用依赖注入的服务均由某个ServiceProvider来提供,但是在ASP.NET Core管道涉及到两个不同的ServiceProvider,其中一个是在管道成功构建后创建并绑定到WebHost上的ServiceProvider,对应着WebHost的Services属性。另一个ServiceProvider则是在管道处理每个请求时即时创建的,它绑定当表示当前请求上下文上,对应着HttpContext的RequestServices属性,两个ServiceProvider之间存在着父子关系。[本文已经同步到《ASP.NET Core框架揭秘》之中]

目录
一、WebHost的ServiceProvider
二、HttpContext的ServiceProvider
    原理分析
    实例证明
    两个ServiceProvider具有“父子”关系
    ServiceProvidersFeature特性
    RequestServicesContainerMiddleware中间件 
    AutoRequestServicesStartupFilter

一、WebHost的ServiceProvider

ASP.NET Core的依赖注入框架其实很简单,其中仅仅涉及ServiceCollection和ServiceProvider这两个核心对象。我们预先将服务描述信息注册到ServiceCollection之上,然后利用ServiceCollection来创建ServiceProvider,并最终利用后者根据指定的服务类型来提供对应的服务实例。接下来我们以这两个对象作为唯一的关注点来回顾一下管道的创建流程。ASP.NET Core管道的创建也仅仅涉及到两个核心对象,作为应用宿主的WebHost对象和创建它的WebHostBuilder。下图基本揭示了WebHostBuilder创建WebHost,以及WebHost在开启过程针对依赖注入这两个核心对象的使用。

1

ASP.NET Core管道在构建过程中会使用同一个ServiceCollection,所有注册的服务都被添加到这个对象上。这个ServiceCollection对象最初由WebHostBuilder创建。在WebHost的创建过程中,WebHostBuilder需要向这个ServiceCollection对象注册两种类型的服务:一种是确保管道能够被成功构建并顺利处理请求所必需的服务,我们不妨将它们称为系统服务;另一种则是用户通过调用ConfigureServices方法自行注册的服务,我们姑且称它们为用户服务

网友评论