ASP.NET Core使用HostingStartup增强启动操作方法详解
"environmentVariables": { "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "HostStartupLib" //假如HostingStartup存在多个措施齐集可以行使;脱离,好比HostStartupLib;HostStartupLib2 //"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "HostStartupLib;HostStartupLib2" } 可以引入多个包括HostingStartup的措施集,在配置WebHostDefaults.HostingStartupAssembliesKey可能ASPNETCORE_HOSTINGSTARTUPASSEMBLIES指定多个措施集名称可以行使英文分号(;)离隔措施集名称。固然是两种形似指定,可是其收??是一样的那就是配置设置key为hostingStartupAssemblie设置的值,下面我们会具体讲授。 源码探讨 在上面我们简朴的先容了HostingStartup的观念及根基的行使方法,基于这些我们发生了几个疑问 起首是关于HostingStartup的根基事变方法是什么 其次是为什么HostingStartup在Web措施中不必要设置措施集信息就可以被挪用到,而通过外部措施集引入HostingStartup必要手动指定措施集 最后是通过外部措施集引入HostingStartup的指定方法为何只能是UseSetting和情形变量的方法 基于以上几个疑问,我们来试探一下HostingStartup的相干源码,来揭开它的隐秘面纱。起首空话不多说直接找到源码位置[点击查察源码👈]在GenericWebHostBuilder类中的ExecuteHostingStartups要领中,关于GenericWebHostBuilder类我们在上篇文章深入探讨ASP.NET Core Startup初始化中首要就是说明这个类,由于这是构建WebHost的默认类,而我们接下来要说的ExecuteHostingStartups要领也是承载在这个类中,直接贴代码如下所示 private void ExecuteHostingStartups() { //通过设置_config和当前措施集名称构建WebHostOptions类 var webHostOptions = new WebHostOptions(_config, Assembly.GetEntryAssembly()?.GetName().Name); //假如PreventHostingStartup属性为true则直接返回 //通过这个可以设置阻止启动逻辑 if (webHostOptions.PreventHostingStartup) { return; } var exceptions = new List<Exception>(); //构建HostingStartupWebHostBuilder _hostingStartupWebHostBuilder = new HostingStartupWebHostBuilder(this); //GetFinalHostingStartupAssemblies获取最终要执行的措施集名称 foreach (var assemblyName in webHostOptions.GetFinalHostingStartupAssemblies().Distinct(StringComparer.OrdinalIgnoreCase)) { try { //通过措施集名称加载措施集信息,由于行使了AssemblyName以是只必要行使措施集名称即可 var assembly = Assembly.Load(new AssemblyName(assemblyName)); //获取包括HostingStartupAttribute的措施集 foreach (var attribute in assembly.GetCustomAttributes<HostingStartupAttribute>()) { //实例化HostingStartupAttribute的HostingStartupType属性的工具实例 //即我们上面声明的[assembly: HostingStartup(typeof(HostStartupWeb.HostingStartupInWeb))] var hostingStartup = (IHostingStartup)Activator.CreateInstance(attribute.HostingStartupType); //挪用HostingStartup的Configure要领 hostingStartup.Configure(_hostingStartupWebHostBuilder); } } catch (Exception ex) { exceptions.Add(new InvalidOperationException($"Startup assembly {assemblyName} failed to execute. See the inner exception for more details.", ex)); } } if (exceptions.Count > 0) { _hostingStartupErrors = new AggregateException(exceptions); } } 通过上面的源码我们就可以很清晰的相识到HostingStartup的根基事变方法。获取的措施齐集包括的HostingStartupAttribute,通过获取HostingStartupAttribute的HostingStartupType属性获得要执行的IHostingStartup实例,最后执行Configure要领,Configure要领必要转达IWebHostBuilder的实例,而HostingStartupWebHostBuilder正是实现了IWebHostBuilder接口。 public IEnumerable<string> GetFinalHostingStartupAssemblies() { return HostingStartupAssemblies.Except(HostingStartupExcludeAssemblies, StringComparer.OrdinalIgnoreCase); } 从这里我们可以看出措施集信息来自于HostingStartupAssemblies属性,并且还要解除去HostingStartupExcludeAssemblies包括的措施集。我们找到他们初始化的相干逻辑大抵如下 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |