.net core IHostBuilder 接口HostBuilder实现类的 Build 的方法 主要做了什么了
.net core IHostBuilder 接口HostBuilder实现类的 Build 的方法 主要做了什么了
主要构造以下 字段
1 private const string HostBuildingDiagnosticListenerName = "Microsoft.Extensions.Hosting";
2 private const string HostBuildingEventName = "HostBuilding";
3 private const string HostBuiltEventName = "HostBuilt";
4
5 private readonly List<Action<IConfigurationBuilder>> _configureHostConfigActions = new List<Action<IConfigurationBuilder>>();
6 private readonly List<Action<HostBuilderContext, IConfigurationBuilder>> _configureAppConfigActions = new List<Action<HostBuilderContext, IConfigurationBuilder>>();
7 private readonly List<Action<HostBuilderContext, IServiceCollection>> _configureServicesActions = new List<Action<HostBuilderContext, IServiceCollection>>();
8 private readonly List<IConfigureContainerAdapter> _configureContainerActions = new List<IConfigureContainerAdapter>();
9 private IServiceFactoryAdapter _serviceProviderFactory;
10 private bool _hostBuilt;
11 private IConfiguration? _hostConfiguration;
12 private IConfiguration? _appConfiguration;
13 private HostBuilderContext? _hostBuilderContext;
14 private HostingEnvironment? _hostingEnvironment;
15 private IServiceProvider? _appServices;
16 private PhysicalFileProvider? _defaultProvider;
源码
1 public IHost Build()
2 {
3 if (_hostBuilt)
4 {
5 throw new InvalidOperationException(SR.BuildCalled);
6 }
7 _hostBuilt = true;
8
9 // REVIEW: If we want to raise more events outside of these calls then we will need to
10 // stash this in a field.
11 using DiagnosticListener diagnosticListener = LogHostBuilding(this);
12
13 InitializeHostConfiguration();
14 InitializeHostingEnvironment();
15 InitializeHostBuilderContext();
16 InitializeAppConfiguration();
17 InitializeServiceProvider();
18
19 return ResolveHost(_appServices, diagnosticListener);
20 }
InitializeHostConfiguration 源码 构造出了 IConfiguration
1 private IConfiguration? _hostConfiguration;
2
3 [MemberNotNull(nameof(_hostConfiguration))]
4 private void InitializeHostConfiguration()
5 {
6 IConfigurationBuilder configBuilder = new ConfigurationBuilder()
7 .AddInMemoryCollection(); // Make sure there's some default storage since there are no default providers
8
9 foreach (Action<IConfigurationBuilder> buildAction in _configureHostConfigActions)
10 {
11 buildAction(configBuilder);
12 }
13 _hostConfiguration = configBuilder.Build();
14 }
15
InitializeHostingEnvironment 源码 构造了
var physicalFileProvider = new PhysicalFileProvider(hostingEnvironment.ContentRootPath);
var hostingEnvironment = new HostingEnvironment()
1 [MemberNotNull(nameof(_defaultProvider))] 2 [MemberNotNull(nameof(_hostingEnvironment))] 3 private void InitializeHostingEnvironment() 4 { 5 (_hostingEnvironment, _defaultProvider) = CreateHostingEnvironment(_hostConfiguration!); // TODO-NULLABLE: https://github.com/dotnet/csharplang/discussions/5778. The same pattern exists below as well. 6 } 7 8 internal static (HostingEnvironment, PhysicalFileProvider) CreateHostingEnvironment(IConfiguration hostConfiguration) 9 { 10 var hostingEnvironment = new HostingEnvironment() 11 { 12 EnvironmentName = hostConfiguration[HostDefaults.EnvironmentKey] ?? Environments.Production, 13 ContentRootPath = ResolveContentRootPath(hostConfiguration[HostDefaults.ContentRootKey], AppContext.BaseDirectory), 14 }; 15 16 string? applicationName = hostConfiguration[HostDefaults.ApplicationKey]; 17 if (string.IsNullOrEmpty(applicationName)) 18 { 19 // Note GetEntryAssembly returns null for the net4x console test runner. 20 applicationName = Assembly.GetEntryAssembly()?.GetName().Name; 21 } 22 23 if (applicationName is not null) 24 { 25 hostingEnvironment.ApplicationName = applicationName; 26 } 27 28 var physicalFileProvider = new PhysicalFileProvider(hostingEnvironment.ContentRootPath); 29 hostingEnvironment.ContentRootFileProvider = physicalFileProvider; 30 31 return (hostingEnvironment, physicalFileProvider); 32 }
InitializeHostBuilderContext 构造了 HostBuilderContext
1 private HostBuilderContext? _hostBuilderContext;
2 [MemberNotNull(nameof(_hostBuilderContext))]
3 private void InitializeHostBuilderContext()
4 {
5 _hostBuilderContext = new HostBuilderContext(Properties)
6 {
7 HostingEnvironment = _hostingEnvironment!,
8 Configuration = _hostConfiguration!
9 };
10 }
InitializeAppConfiguration 构造了 IConfiguration? HostBuilderContext
1 private IConfiguration? _appConfiguration;
2 private HostBuilderContext? _hostBuilderContext;
3
4 [MemberNotNull(nameof(_appConfiguration))]
5 private void InitializeAppConfiguration()
6 {
7 IConfigurationBuilder configBuilder = new ConfigurationBuilder()
8 .SetBasePath(_hostingEnvironment!.ContentRootPath)
9 .AddConfiguration(_hostConfiguration!, shouldDisposeConfiguration: true);
10
11 foreach (Action<HostBuilderContext, IConfigurationBuilder> buildAction in _configureAppConfigActions)
12 {
13 buildAction(_hostBuilderContext!, configBuilder);
14 }
15 _appConfiguration = configBuilder.Build();
16 _hostBuilderContext!.Configuration = _appConfiguration;
17 }
InitializeServiceProvider 构造出了 IServiceProvider? _appServices;
1 private IServiceProvider? _appServices;
2
3 [MemberNotNull(nameof(_appServices))]
4 private void InitializeServiceProvider()
5 {
6 var services = new ServiceCollection();
7
8 PopulateServiceCollection(
9 services,
10 _hostBuilderContext!,
11 _hostingEnvironment!,
12 _defaultProvider!,
13 _appConfiguration!,
14 () => _appServices!);
15
16 foreach (Action<HostBuilderContext, IServiceCollection> configureServicesAction in _configureServicesActions)
17 {
18 configureServicesAction(_hostBuilderContext!, services);
19 }
20
21 object containerBuilder = _serviceProviderFactory.CreateBuilder(services);
22
23 foreach (IConfigureContainerAdapter containerAction in _configureContainerActions)
24 {
25 containerAction.ConfigureContainer(_hostBuilderContext!, containerBuilder);
26 }
27
28 _appServices = _serviceProviderFactory.CreateServiceProvider(containerBuilder);
29 }