.NET Core 3.1.1--HostBuilder 类源码

  1 // Microsoft.Extensions.Hosting.HostBuilder
  2 using Microsoft.Extensions.Configuration;
  3 using Microsoft.Extensions.DependencyInjection;
  4 using Microsoft.Extensions.FileProviders;
  5 using Microsoft.Extensions.Hosting;
  6 using Microsoft.Extensions.Hosting.Internal;
  7 using System;
  8 using System.Collections.Generic;
  9 using System.IO;
 10 using System.Reflection;
 11 
 12 public class HostBuilder : IHostBuilder
 13 {
 14     private List<Action<IConfigurationBuilder>> _configureHostConfigActions = new List<Action<IConfigurationBuilder>>();
 15 
 16     private List<Action<HostBuilderContext, IConfigurationBuilder>> _configureAppConfigActions = new List<Action<HostBuilderContext, IConfigurationBuilder>>();
 17 
 18     private List<Action<HostBuilderContext, IServiceCollection>> _configureServicesActions = new List<Action<HostBuilderContext, IServiceCollection>>();
 19 
 20     private List<IConfigureContainerAdapter> _configureContainerActions = new List<IConfigureContainerAdapter>();
 21 
 22     private IServiceFactoryAdapter _serviceProviderFactory = new ServiceFactoryAdapter<IServiceCollection>(new DefaultServiceProviderFactory());
 23 
 24     private bool _hostBuilt;
 25 
 26     private IConfiguration _hostConfiguration;
 27 
 28     private IConfiguration _appConfiguration;
 29 
 30     private HostBuilderContext _hostBuilderContext;
 31 
 32     private HostingEnvironment _hostingEnvironment;
 33 
 34     private IServiceProvider _appServices;
 35 
 36     public IDictionary<object, object> Properties
 37     {
 38         get;
 39     } = new Dictionary<object, object>();
 40 
 41 
 42     public IHostBuilder ConfigureHostConfiguration(Action<IConfigurationBuilder> configureDelegate)
 43     {
 44         _configureHostConfigActions.Add(configureDelegate ?? throw new ArgumentNullException("configureDelegate"));
 45         return this;
 46     }
 47 
 48     public IHostBuilder ConfigureAppConfiguration(Action<HostBuilderContext, IConfigurationBuilder> configureDelegate)
 49     {
 50         _configureAppConfigActions.Add(configureDelegate ?? throw new ArgumentNullException("configureDelegate"));
 51         return this;
 52     }
 53 
 54     public IHostBuilder ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate)
 55     {
 56         _configureServicesActions.Add(configureDelegate ?? throw new ArgumentNullException("configureDelegate"));
 57         return this;
 58     }
 59 
 60     public IHostBuilder UseServiceProviderFactory<TContainerBuilder>(IServiceProviderFactory<TContainerBuilder> factory)
 61     {
 62         _serviceProviderFactory = new ServiceFactoryAdapter<TContainerBuilder>(factory ?? throw new ArgumentNullException("factory"));
 63         return this;
 64     }
 65 
 66     public IHostBuilder UseServiceProviderFactory<TContainerBuilder>(Func<HostBuilderContext, IServiceProviderFactory<TContainerBuilder>> factory)
 67     {
 68         _serviceProviderFactory = new ServiceFactoryAdapter<TContainerBuilder>(() => _hostBuilderContext, factory ?? throw new ArgumentNullException("factory"));
 69         return this;
 70     }
 71 
 72     public IHostBuilder ConfigureContainer<TContainerBuilder>(Action<HostBuilderContext, TContainerBuilder> configureDelegate)
 73     {
 74         _configureContainerActions.Add(new ConfigureContainerAdapter<TContainerBuilder>(configureDelegate ?? throw new ArgumentNullException("configureDelegate")));
 75         return this;
 76     }
 77 
 78     public IHost Build()
 79     {
 80         if (_hostBuilt)
 81         {
 82             throw new InvalidOperationException("Build can only be called once.");
 83         }
 84         _hostBuilt = true;
 85         BuildHostConfiguration();
 86         CreateHostingEnvironment();
 87         CreateHostBuilderContext();
 88         BuildAppConfiguration();
 89         CreateServiceProvider();
 90         return _appServices.GetRequiredService<IHost>();
 91     }
 92 
 93     private void BuildHostConfiguration()
 94     {
 95         IConfigurationBuilder configurationBuilder = new ConfigurationBuilder().AddInMemoryCollection();
 96         foreach (Action<IConfigurationBuilder> configureHostConfigAction in _configureHostConfigActions)
 97         {
 98             configureHostConfigAction(configurationBuilder);
 99         }
100         _hostConfiguration = configurationBuilder.Build();
101     }
102 
103     private void CreateHostingEnvironment()
104     {
105         _hostingEnvironment = new HostingEnvironment
106         {
107             ApplicationName = _hostConfiguration[HostDefaults.ApplicationKey],
108             EnvironmentName = (_hostConfiguration[HostDefaults.EnvironmentKey] ?? Environments.Production),
109             ContentRootPath = ResolveContentRootPath(_hostConfiguration[HostDefaults.ContentRootKey], AppContext.BaseDirectory)
110         };
111         if (string.IsNullOrEmpty(_hostingEnvironment.ApplicationName))
112         {
113             _hostingEnvironment.ApplicationName = Assembly.GetEntryAssembly()?.GetName().Name;
114         }
115         _hostingEnvironment.ContentRootFileProvider = new PhysicalFileProvider(_hostingEnvironment.ContentRootPath);
116     }
117 
118     private string ResolveContentRootPath(string contentRootPath, string basePath)
119     {
120         if (string.IsNullOrEmpty(contentRootPath))
121         {
122             return basePath;
123         }
124         if (Path.IsPathRooted(contentRootPath))
125         {
126             return contentRootPath;
127         }
128         return Path.Combine(Path.GetFullPath(basePath), contentRootPath);
129     }
130 
131     private void CreateHostBuilderContext()
132     {
133         _hostBuilderContext = new HostBuilderContext(Properties)
134         {
135             HostingEnvironment = _hostingEnvironment,
136             Configuration = _hostConfiguration
137         };
138     }
139 
140     private void BuildAppConfiguration()
141     {
142         IConfigurationBuilder configurationBuilder = new ConfigurationBuilder().SetBasePath(_hostingEnvironment.ContentRootPath).AddConfiguration(_hostConfiguration, shouldDisposeConfiguration: true);
143         foreach (Action<HostBuilderContext, IConfigurationBuilder> configureAppConfigAction in _configureAppConfigActions)
144         {
145             configureAppConfigAction(_hostBuilderContext, configurationBuilder);
146         }
147         _appConfiguration = configurationBuilder.Build();
148         _hostBuilderContext.Configuration = _appConfiguration;
149     }
150 
151     private void CreateServiceProvider()
152     {
153         ServiceCollection serviceCollection = new ServiceCollection();
154         ((IServiceCollection)serviceCollection).AddSingleton((IHostingEnvironment)_hostingEnvironment);
155         ((IServiceCollection)serviceCollection).AddSingleton((IHostEnvironment)_hostingEnvironment);
156         serviceCollection.AddSingleton(_hostBuilderContext);
157         serviceCollection.AddSingleton((IServiceProvider _) => _appConfiguration);
158         serviceCollection.AddSingleton((IServiceProvider s) => (IApplicationLifetime)s.GetService<IHostApplicationLifetime>());
159         serviceCollection.AddSingleton<IHostApplicationLifetime, ApplicationLifetime>();
160         serviceCollection.AddSingleton<IHostLifetime, ConsoleLifetime>();
161         serviceCollection.AddSingleton<IHost, Microsoft.Extensions.Hosting.Internal.Host>();
162         serviceCollection.AddOptions();
163         serviceCollection.AddLogging();
164         foreach (Action<HostBuilderContext, IServiceCollection> configureServicesAction in _configureServicesActions)
165         {
166             configureServicesAction(_hostBuilderContext, serviceCollection);
167         }
168         object containerBuilder = _serviceProviderFactory.CreateBuilder(serviceCollection);
169         foreach (IConfigureContainerAdapter configureContainerAction in _configureContainerActions)
170         {
171             configureContainerAction.ConfigureContainer(_hostBuilderContext, containerBuilder);
172         }
173         _appServices = _serviceProviderFactory.CreateServiceProvider(containerBuilder);
174         if (_appServices == null)
175         {
176             throw new InvalidOperationException("The IServiceProviderFactory returned a null IServiceProvider.");
177         }
178         _appServices.GetService<IConfiguration>();
179     }
180 }

猜你喜欢

转载自www.cnblogs.com/YourDirection/p/12446955.html
今日推荐