From ba2bca4a9627989e338aa8fd3b409fd964efef86 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Thu, 27 Apr 2017 08:14:09 -0700 Subject: [PATCH] Run IHostingStartup's before materializing IConfiguration (#1052) --- .../WebHostBuilder.cs | 58 +++++++++---------- .../WebHostBuilderTests.cs | 22 ++++++- 2 files changed, 50 insertions(+), 30 deletions(-) diff --git a/src/Microsoft.AspNetCore.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNetCore.Hosting/WebHostBuilder.cs index 5ae258f924..e721925937 100644 --- a/src/Microsoft.AspNetCore.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNetCore.Hosting/WebHostBuilder.cs @@ -273,35 +273,6 @@ namespace Microsoft.AspNetCore.Hosting _options = new WebHostOptions(_config); - var contentRootPath = ResolveContentRootPath(_options.ContentRootPath, AppContext.BaseDirectory); - var applicationName = _options.ApplicationName; - - // Initialize the hosting environment - _hostingEnvironment.Initialize(applicationName, contentRootPath, _options); - _context.HostingEnvironment = _hostingEnvironment; - - var services = new ServiceCollection(); - services.AddSingleton(_hostingEnvironment); - services.AddSingleton(_context); - - var builder = new ConfigurationBuilder() - .SetBasePath(_hostingEnvironment.ContentRootPath) - .AddInMemoryCollection(_config.AsEnumerable()); - - foreach (var configureAppConfiguration in _configureAppConfigurationBuilderDelegates) - { - configureAppConfiguration(_context, builder); - } - - var configuration = builder.Build(); - services.AddSingleton(configuration); - _context.Configuration = configuration; - - // The configured ILoggerFactory is added as a singleton here. AddLogging below will not add an additional one. - var loggerFactory = _createLoggerFactoryDelegate?.Invoke(_context) ?? new LoggerFactory(configuration.GetSection("Logging")); - services.AddSingleton(loggerFactory); - _context.LoggerFactory = loggerFactory; - if (!_options.PreventHostingStartup) { var exceptions = new List(); @@ -338,6 +309,35 @@ namespace Microsoft.AspNetCore.Hosting } } + var contentRootPath = ResolveContentRootPath(_options.ContentRootPath, AppContext.BaseDirectory); + var applicationName = _options.ApplicationName; + + // Initialize the hosting environment + _hostingEnvironment.Initialize(applicationName, contentRootPath, _options); + _context.HostingEnvironment = _hostingEnvironment; + + var services = new ServiceCollection(); + services.AddSingleton(_hostingEnvironment); + services.AddSingleton(_context); + + var builder = new ConfigurationBuilder() + .SetBasePath(_hostingEnvironment.ContentRootPath) + .AddInMemoryCollection(_config.AsEnumerable()); + + foreach (var configureAppConfiguration in _configureAppConfigurationBuilderDelegates) + { + configureAppConfiguration(_context, builder); + } + + var configuration = builder.Build(); + services.AddSingleton(configuration); + _context.Configuration = configuration; + + // The configured ILoggerFactory is added as a singleton here. AddLogging below will not add an additional one. + var loggerFactory = _createLoggerFactoryDelegate?.Invoke(_context) ?? new LoggerFactory(configuration.GetSection("Logging")); + services.AddSingleton(loggerFactory); + _context.LoggerFactory = loggerFactory; + foreach (var configureLogging in _configureLoggingDelegates) { configureLogging(_context, loggerFactory); diff --git a/test/Microsoft.AspNetCore.Hosting.Tests/WebHostBuilderTests.cs b/test/Microsoft.AspNetCore.Hosting.Tests/WebHostBuilderTests.cs index e5f809f3c5..4c5ff5b4bc 100644 --- a/test/Microsoft.AspNetCore.Hosting.Tests/WebHostBuilderTests.cs +++ b/test/Microsoft.AspNetCore.Hosting.Tests/WebHostBuilderTests.cs @@ -931,6 +931,21 @@ namespace Microsoft.AspNetCore.Hosting } } + [Fact] + public void Build_ConfigureAppConfigurationInHostingStartupWorks() + { + var builder = CreateWebHostBuilder() + .CaptureStartupErrors(false) + .Configure(app => { }) + .UseServer(new TestServer()); + + using (var host = (WebHost)builder.Build()) + { + var configuration = host.Services.GetRequiredService(); + Assert.Equal("value", configuration["testhostingstartup:config"]); + } + } + [Fact] public void Build_DoesRunHostingStartupFromPrimaryAssemblyEvenIfNotSpecified() { @@ -1089,7 +1104,12 @@ namespace Microsoft.AspNetCore.Hosting .UseSetting("testhostingstartup_chain", builder.GetSetting("testhostingstartup_chain") + "0") .ConfigureServices(services => services.AddSingleton()) .ConfigureServices(services => services.AddSingleton(loggerProvider.Sink)) - .ConfigureLogging(lf => lf.AddProvider(loggerProvider)); + .ConfigureLogging(lf => lf.AddProvider(loggerProvider)) + .ConfigureAppConfiguration((context, configurationBuilder) => configurationBuilder.AddInMemoryCollection( + new [] + { + new KeyValuePair("testhostingstartup:config", "value") + })); } }