深入探究ASP.NET Core Startup初始化问题
看完ConfigureServicesBuilder类的实现逻辑,关于通过什么样的逻辑查找并执行ConfigureServices方法的逻辑就非常清晰了。首先是查找ConfigureServices方法,即包含环境变量的ConfigureServices方法名称比如(ConfigureDevelopmentServices)或名为ConfigureServices的方法,返回的是ConfigureServicesBuilder对象。然后执行ConfigureServicesBuilder的Build方法,这个方法里包含了执行ConfigureServices的规则,即ConfigureServices只能包含一个参数且类型为IServiceCollection,然后将当前程序中存在的IServiceCollection实例传递给它。 Configure的装载 我们常使用Startup的Configure方法去配置中间件,默认生成的Configure方法为我们添加了IApplicationBuilder和IWebHostEnvironment实例,但是其实Configure方法不仅仅可以传递这两个参数,它可以通过参数注入在IServiceCollection中注册的所有服务,究竟是如何实现的呢,接下来我们继续探究UseStartup方法查找源码查看想实现 [点击查看源码],我们抽离出来核心实现如下 //和ConfigureServices查找方式类似传递Startup实例和环境变量 我们通过查看GenericWebHostServiceOptions的源码可知ConfigureApplication属性的类型为Action也就是说app参数其实就是IApplicationBuilder接口的实例。通过上面这段代码可以看出,主要逻辑就是调用StartupLoader的FindConfigureDelegate方法,然后返回ConfigureBuilder建造类,然后构建出Configure方法并执行。首先我们来查看FindConfigureDelegate的逻辑实现 [点击查看源码] internal static ConfigureBuilder FindConfigureDelegate(Type startupType, string environmentName) 从这里我们可以看到FindConfigureDelegate方法也是调用的FindMethod方法,只是传递的方法名字符串为Configure或Configure+环境变量,关于FindMethod的方法实现我们在上面讲解ConfigureServices方法的时候已经非常详细的说过了,这里就不过多的讲解了。总之是通过FindMethod去查找名为Configure的方法或名为Configure+环境变量的方法比如ConfigureDevelopment查找规则和ConfigureServices是完全一致的。但是Configure方法却可以通过参数注入注册到IServiceCollection中的服务,答案我们同样要在ConfigureBuilder类中去探寻 [点击查看源码] internal class ConfigureBuilder public MethodInfo MethodInfo { get; } 通过ConfigureBuilder类的实现逻辑,可以清晰的看到为何Configure方法参数可以注入任何在IServiceCollection中注册的服务了。接下来我们总结一下Configure方法的初始化逻辑,首先在Startup中查找方法名为Configure或Configure+环境变量名称(比如ConfigureDevelopment)的方法,然后查找IApplicationBuilder类型的参数,如果找到则将程序中的IApplicationBuilder实例传递给它。至于为何Configure方法能够通过参数注入任何在IServiceCollection中注册的服务,则是因为循环Configure中的所有参数然后在IOC容器中获取对应实例赋值过来,Configure方法的参数一定得是在IServiceCollection注册过的类型,否则会抛出异常。 ConfigureContainer为何会被调用 (编辑:应用网_阳江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |