diff --git a/src/libraries/Microsoft.Extensions.Hosting/src/HostBuilder.cs b/src/libraries/Microsoft.Extensions.Hosting/src/HostBuilder.cs index 7a965e0efc85f5..f5fc7dff320c55 100644 --- a/src/libraries/Microsoft.Extensions.Hosting/src/HostBuilder.cs +++ b/src/libraries/Microsoft.Extensions.Hosting/src/HostBuilder.cs @@ -37,6 +37,7 @@ public partial class HostBuilder : IHostBuilder private HostingEnvironment? _hostingEnvironment; private IServiceProvider? _appServices; private PhysicalFileProvider? _defaultProvider; + private readonly bool _defaultProviderFactoryUsed; /// /// Initializes a new instance of . @@ -44,6 +45,7 @@ public partial class HostBuilder : IHostBuilder public HostBuilder() { _serviceProviderFactory = new ServiceFactoryAdapter(new DefaultServiceProviderFactory()); + _defaultProviderFactoryUsed = true; } /// @@ -349,6 +351,11 @@ private void InitializeServiceProvider() configureServicesAction(_hostBuilderContext!, services); } + if (_hostBuilderContext!.HostingEnvironment.IsDevelopment() && _defaultProviderFactoryUsed) + { + _serviceProviderFactory = new ServiceFactoryAdapter(new DefaultServiceProviderFactory(new ServiceProviderOptions { ValidateOnBuild = true, ValidateScopes = true })); + } + object containerBuilder = _serviceProviderFactory.CreateBuilder(services); foreach (IConfigureContainerAdapter containerAction in _configureContainerActions) diff --git a/src/libraries/Microsoft.Extensions.Hosting/tests/UnitTests/HostBuilderTests.cs b/src/libraries/Microsoft.Extensions.Hosting/tests/UnitTests/HostBuilderTests.cs index 5d37dbd15ec333..7db76f07508278 100644 --- a/src/libraries/Microsoft.Extensions.Hosting/tests/UnitTests/HostBuilderTests.cs +++ b/src/libraries/Microsoft.Extensions.Hosting/tests/UnitTests/HostBuilderTests.cs @@ -533,6 +533,33 @@ public void CustomContainerTypeMismatchThrows() Assert.Throws(() => hostBuilder.Build()); } + [Fact] + public void ScopeValidationEnabledInDevelopment() + { + using var host = new HostBuilder() + .UseEnvironment(Environments.Development) + .ConfigureServices(serices => + { + serices.AddScoped(); + }) + .Build(); + + Assert.Throws(() => { host.Services.GetRequiredService(); }); + } + + [Fact] + public void ValidateOnBuildEnabledInDevelopment() + { + var hostBuilder = new HostBuilder() + .UseEnvironment(Environments.Development) + .ConfigureServices(serices => + { + serices.AddSingleton(); + }); + + Assert.Throws(() => hostBuilder.Build()); + } + [Fact] public void HostingContextContainsAppConfigurationDuringConfigureLogging() {