深入探究ASP.NET Core Startup初始化问题
internal static ConfigureContainerBuilder FindConfigureContainerDelegate(Type startupType, string environmentName) { //按照startupType和按照environmentName构建的Configure{0}Services字符串先去查找返回范例为IServiceProvider的要领 var configureMethod = FindMethod(startupType, "Configure{0}Container", environmentName, typeof(void), required: false); //用查找到的要领去初始化ConfigureContainerBuilder return new ConfigureContainerBuilder(configureMethod); } 公然照旧这个配方这个味道,空话不多说直接查察ConfigureContainerBuilder源码 internal class ConfigureContainerBuilder { public ConfigureContainerBuilder(MethodInfo configureContainerMethod) { MethodInfo = configureContainerMethod; } public MethodInfo MethodInfo { get; } public Func<Action<object>, Action<object>> ConfigureContainerFilters { get; set; } = f => f; public Action<object> Build(object instance) => container => Invoke(instance, container); //查找容器范例,着实就是ConfigureContainer要领的的独一参数 public Type GetContainerType() { var parameters = MethodInfo.GetParameters(); //ConfigureContainer要领只能包括一个参数 if (parameters.Length != 1) { throw new InvalidOperationException($"The {MethodInfo.Name} method must take only one parameter."); } return parameters[0].ParameterType; } private void Invoke(object instance, object container) { ConfigureContainerFilters(StartupConfigureContainer)(container); void StartupConfigureContainer(object containerBuilder) => InvokeCore(instance, containerBuilder); } //按照转达的container工具执行ConfigureContainer要领逻辑好比行使autofac时ConfigureContainer(ContainerBuilder) private void InvokeCore(object instance, object container) { if (MethodInfo == null) { return; } var arguments = new object[1] { container }; MethodInfo.InvokeWithoutWrappingExceptions(instance, arguments); } } 果不其然千大哥方下来照旧谁人味道,和ConfigureServices、Configure要领思绪险些同等。这里必要留意的是GetContainerType获取的容器范例是ConfigureContainer要领的独一参数即容器范例,假如转达多个参数则直接抛出非常。着实Startup的ConfigureContainer要领颠末花里胡哨的一番操纵之后,最终照旧转换成了雷士如下的操纵方法,这个我们在上面代码中构建actionType的时辰就可以看出,最终通过查找到的容器范例去完成注册等相干操纵,这里就不外多的讲授了 Host.CreateDefaultBuilder(args) .ConfigureContainer<ContainerBuilder>((context,container)=> { container.RegisterType<PersonService>().As<IPersonService>().InstancePerLifetimeScope(); }); 总结 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |