.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         }

 

posted on 2023-02-24 00:42  是水饺不是水饺  阅读(48)  评论(0编辑  收藏  举报

导航