从这里我们可以看出措施集信息来自于HostingStartupAssemblies属性,并且还要解除去HostingStartupExcludeAssemblies包括的措施集。我们找到他们初始化的相关逻辑大抵如下
//承载启动是需要挪用的HostingStartup措施集 public IReadOnlyList<string> HostingStartupAssemblies { get; set; } //承载启动时解除去不不要执行的措施集 public IReadOnlyList<string> HostingStartupExcludeAssemblies { get; set; } //是否阻止HostingStartup启动执行成果,假如配置为false则HostingStartup成果失效 //通过上面的ExecuteHostingStartups要领源码可知 public bool PreventHostingStartup { get; set; } //应用措施名称 public string ApplicationName { get; set; } public WebHostOptions(IConfiguration configuration, string applicationNameFallback) { ApplicationName = configuration[WebHostDefaults.ApplicationKey] ?? applicationNameFallback; HostingStartupAssemblies = Split($"{ApplicationName};{configuration[WebHostDefaults.HostingStartupAssembliesKey]}"); HostingStartupExcludeAssemblies = Split(configuration[WebHostDefaults.HostingStartupExcludeAssembliesKey]); PreventHostingStartup = WebHostUtilities.ParseBool(configuration, WebHostDefaults.PreventHostingStartupKey); } //脱离设置的措施集信息,脱离依据为";"分号,这也是我们上面说过设置多措施集的时候回收分号脱离的原因 private IReadOnlyList<string> Split(string value) { return value?.Split(';', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries) ?? Array.Empty<string>(); }
首先,通过HostingStartupAssemblies的初始化逻辑我们可以得出,默认会是有两个数据来历,一个是当前的ApplicationName,另一个是通过HostingStartupAssembliesKey设置的措施集信息。这也解答了我们上面说过的为什么HostingStartup在Web措施中不需要设置措施集信息就可以被挪用到,而通过外部措施集引入HostingStartup需要手动指定措施集。其次,我们可以相识到通过设置HostingStartupExcludeAssemblies信息解除你不想启动的HostingStartup措施集,并且还可以通过设置PreventHostingStartup值来克制利用HostingStartup的成果。
通过上面的代码我们还相识到这三个属性的来历的设置名称都是来自WebHostDefaults这个常量类,接下来我们查察一下这三个属性对应的设置名称
public static readonly string HostingStartupAssembliesKey = "hostingStartupAssemblies"; public static readonly string HostingStartupExcludeAssembliesKey = "hostingStartupExcludeAssemblies"; public static readonly string PreventHostingStartupKey = "preventHostingStartup";
也就是说,我们可以可以通过设置这三个名称的设置,来完成HostingStartup相关的成果好比
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { //通过UseSetting的方法指定措施集的名称 webBuilder.UseSetting(WebHostDefaults.HostingStartupAssembliesKey, "HostStartupLib"); //假如HostingStartup存在多个措施会合可以利用;脱离,好比HostStartupLib;HostStartupLib2 //webBuilder.UseSetting(WebHostDefaults.HostingStartupAssembliesKey, "HostStartupLib;HostStartupLib2"); //解除执行HostStartupLib2措施集执行HostingStartup逻辑 webBuilder.UseSetting(WebHostDefaults.HostingStartupExcludeAssembliesKey, "HostStartupLib2"); //禁用HostingStartup成果 webBuilder.UseSetting(WebHostDefaults.PreventHostingStartupKey, "true"); webBuilder.UseStartup<Startup>(); });
或通过情况变量的方法去操纵
"environmentVariables": { "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "HostStartupLib", //假如HostingStartup存在多个措施会合可以利用;脱离,好比HostStartupLib;HostStartupLib2 //"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "HostStartupLib;HostStartupLib2" //解除执行HostStartupLib2措施集执行HostingStartup逻辑 "ASPNETCORE_HOSTINGSTARTUPEXCLUDEASSEMBLIES":"HostStartupLib2", //禁用HostingStartup成果 "ASPNETCORE_PREVENTHOSTINGSTARTUP":"true" }
其实这两种设置方法是完全等价的,为什么这么说呢?首先是在Configuration中获取设置是忽略巨细写的,其实是利用ConfigureWebHostDefaults设置WebHost相关信息的时候会添加configBuilder.AddEnvironmentVariables(prefix: "ASPNETCORE_")逻辑这样的话获取情况变量的时候可以忽略ASPNETCORE_前缀。
那么到今朝为止,尚有一个疑问尚未办理,那就是为何只能通过UseSetting和情况变量的方法去设置HostingStartup相关设置,解铃还须系铃人,我们在上面的ExecuteHostingStartups要领中看到了这个逻辑
//这里通报了一个_config var webHostOptions = new WebHostOptions(_config, Assembly.GetEntryAssembly()?.GetName().Name);
我们可以看到通报了设置Configuration的实例_config,我们到初始化_config处所有如下逻辑