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 }
.NET Core 3.1.1--HostBuilder 类源码
猜你喜欢
转载自www.cnblogs.com/YourDirection/p/12446955.html
今日推荐
周排行