From dcf49f257560130597b35f3b059b4ed34e8e3ead Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 9 May 2019 09:14:31 -0700 Subject: [PATCH] Move service registration before hosting startups run (#10105) * Move service registration before hosting startups run - This allows IHostingStartup to see default service registrations and override them. - Added a test to verify that hosting startup can see the IWebHostingEnvironment. Unfortunately this is used by MVC to get the application name before the container is baked. This was found when porting our workshop from 2.2 to 3.0 --- .../src/GenericHost/GenericWebHostBuilder.cs | 12 +++--------- src/Hosting/Hosting/test/WebHostBuilderTests.cs | 13 +++++++++++++ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs b/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs index 788995b320..a42e5cbf48 100644 --- a/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs +++ b/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs @@ -55,15 +55,6 @@ namespace Microsoft.AspNetCore.Hosting.Internal } }); - _builder.ConfigureServices((context, services) => - { - if (_hostingStartupWebHostBuilder != null) - { - var webhostContext = GetWebHostBuilderContext(context); - _hostingStartupWebHostBuilder.ConfigureServices(webhostContext, services); - } - }); - _builder.ConfigureServices((context, services) => { var webhostContext = GetWebHostBuilderContext(context); @@ -96,6 +87,9 @@ namespace Microsoft.AspNetCore.Hosting.Internal services.TryAddScoped(); services.TryAddSingleton(); + // IMPORTANT: This needs to run *before* direct calls on the builder (like UseStartup) + _hostingStartupWebHostBuilder?.ConfigureServices(webhostContext, services); + // Support UseStartup(assemblyName) if (!string.IsNullOrEmpty(webHostOptions.StartupAssembly)) { diff --git a/src/Hosting/Hosting/test/WebHostBuilderTests.cs b/src/Hosting/Hosting/test/WebHostBuilderTests.cs index 0c962c5848..4db65a21d9 100644 --- a/src/Hosting/Hosting/test/WebHostBuilderTests.cs +++ b/src/Hosting/Hosting/test/WebHostBuilderTests.cs @@ -1472,6 +1472,19 @@ namespace Microsoft.AspNetCore.Hosting var loggerProvider = new TestLoggerProvider(); builder.UseSetting("testhostingstartup", "0") .UseSetting("testhostingstartup_chain", builder.GetSetting("testhostingstartup_chain") + "0") + .ConfigureServices(services => + { + // This check is required because MVC still uses the + // IWebHostEnvironment instance before the container is baked +#pragma warning disable CS0618 // Type or member is obsolete + var heDescriptor = services.SingleOrDefault(s => s.ServiceType == typeof(IHostingEnvironment)); + Assert.NotNull(heDescriptor); + Assert.NotNull(heDescriptor.ImplementationInstance); +#pragma warning restore CS0618 // Type or member is obsolete + var wheDescriptor = services.SingleOrDefault(s => s.ServiceType == typeof(IWebHostEnvironment)); + Assert.NotNull(wheDescriptor); + Assert.NotNull(wheDescriptor.ImplementationInstance); + }) .ConfigureServices(services => services.AddSingleton()) .ConfigureServices(services => services.AddSingleton(loggerProvider.Sink)) .ConfigureLogging((_, lf) => lf.AddProvider(loggerProvider))