深入探究ASP.NET Core Startup初始化问题
通过FindMethod方法我们可以得到几个结论,首先ConfigureServices方法的名称可以是包含环境变量的名称比如(ConfigureDevelopmentServices),其次方法可以为共有的静态或非静态方法。FindMethod方法是真正执行查找的逻辑所在,如果找到相关方法则返回MethodInfo。FindMethod查找的方法名称是通过methodName参数传递进来的,我们标注的注释代码都是直接写死了ConfigureServices方法,只是为了便于说明理解,但其实FindMethod是通用方法,接下来我们要讲解的内容还会涉及到这个方法,到时候关于这个代码的逻辑我们就不会在进行说明了,因为是同一个方法,希望大家能注意到这一点。 internal class ConfigureServicesBuilder { //构造函数传递的configureServices的MethodInfo public ConfigureServicesBuilder(MethodInfo configureServices) { MethodInfo = configureServices; } public MethodInfo MethodInfo { get; } public Func<Func<IServiceCollection, IServiceProvider>, Func<IServiceCollection, IServiceProvider>> StartupServiceFilters { get; set; } = f => f; //Build委托 public Func<IServiceCollection, IServiceProvider> Build(object instance) => services => Invoke(instance, services); private IServiceProvider Invoke(object instance, IServiceCollection services) { //执行StartupServiceFilters委托参数为Func<IServiceCollection, IServiceProvider>类型的委托方法即Startup //返回了Func<IServiceCollection, IServiceProvider>委托,执行这个委托需传递services即IServiceCollections实例返回IServiceProvider类型 return StartupServiceFilters(Startup)(services); IServiceProvider Startup(IServiceCollection serviceCollection) => InvokeCore(instance, serviceCollection); } private IServiceProvider InvokeCore(object instance, IServiceCollection services) { if (MethodInfo == null) { return null; } // 如果ConfigureServices方法包含多个参数或方法参数类型不是IServiceCollection类型则直接抛出异常 // 也就是说ConfigureServices只能包含一个参数且类型为IServiceCollection var parameters = MethodInfo.GetParameters(); if (parameters.Length > 1 || parameters.Any(p => p.ParameterType != typeof(IServiceCollection))) { throw new InvalidOperationException("The ConfigureServices method must either be parameterless or take only one parameter of type IServiceCollection."); } //找到ConfigureServices方法的参数,并将services即IServiceCollection的实例传递给这个参数 var arguments = new object[MethodInfo.GetParameters().Length]; if (parameters.Length > 0) { arguments[0] = services; } // 执行返回IServiceProvider实例 return MethodInfo.InvokeWithoutWrappingExceptions(instance, arguments) as IServiceProvider; } } (编辑:重庆站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 全国建材家居卖场9月销售额环比上涨14.99%
- iOS 11.1更新了什么 iOS 11.1更新内容一览
- watchOS 2.2 beta版发布 苹果手表watchOS 2.2系统更新内容
- jQuery图片切换代码,横向拉动的幻灯片效果
- 机甲mesuit发布会在哪看 机甲mesuit发布会直播地址分享
- ASP.NET Core使用HostingStartup增强启动操作方法详解
- 浅谈ASP.NET Core静态文件处理源码探究
- iPhone X运行内存3GB iPhone 8运行内存2GB iPhone 8P 3GB运
- 用不着妄自菲薄?对ASP和ASP程序员的一些话
- ios10.3影院模式是什么 ios10.3新功能影院模式介绍