Skip to content

[Group 8] Enable nullable annotations for Microsoft.Extensions.Hosting #67511

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Apr 16, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ namespace Microsoft.Extensions.Hosting
{
public enum BackgroundServiceExceptionBehavior
{
StopHost,
Ignore
StopHost = 0,
Ignore = 1,
}
public partial class ConsoleLifetimeOptions
{
Expand All @@ -26,31 +26,31 @@ public ConsoleLifetimeOptions() { }
public static partial class Host
{
public static Microsoft.Extensions.Hosting.HostApplicationBuilder CreateApplicationBuilder() { throw null; }
public static Microsoft.Extensions.Hosting.HostApplicationBuilder CreateApplicationBuilder(string[] args) { throw null; }
public static Microsoft.Extensions.Hosting.HostApplicationBuilder CreateApplicationBuilder(string[]? args) { throw null; }
public static Microsoft.Extensions.Hosting.IHostBuilder CreateDefaultBuilder() { throw null; }
public static Microsoft.Extensions.Hosting.IHostBuilder CreateDefaultBuilder(string[] args) { throw null; }
public static Microsoft.Extensions.Hosting.IHostBuilder CreateDefaultBuilder(string[]? args) { throw null; }
}
public sealed partial class HostApplicationBuilder
{
public HostApplicationBuilder() { }
public HostApplicationBuilder(Microsoft.Extensions.Hosting.HostApplicationBuilderSettings settings) { }
public HostApplicationBuilder(string[] args) { }
public HostApplicationBuilder(Microsoft.Extensions.Hosting.HostApplicationBuilderSettings? settings) { }
public HostApplicationBuilder(string[]? args) { }
public Microsoft.Extensions.Configuration.ConfigurationManager Configuration { get { throw null; } }
public Microsoft.Extensions.Hosting.IHostEnvironment Environment { get { throw null; } }
public Microsoft.Extensions.Logging.ILoggingBuilder Logging { get { throw null; } }
public Microsoft.Extensions.DependencyInjection.IServiceCollection Services { get { throw null; } }
public Microsoft.Extensions.Hosting.IHost Build() { throw null; }
public void ConfigureContainer<TContainerBuilder>(Microsoft.Extensions.DependencyInjection.IServiceProviderFactory<TContainerBuilder> factory, System.Action<TContainerBuilder> configure = null) where TContainerBuilder : notnull { }
public void ConfigureContainer<TContainerBuilder>(Microsoft.Extensions.DependencyInjection.IServiceProviderFactory<TContainerBuilder> factory, System.Action<TContainerBuilder>? configure = null) where TContainerBuilder : notnull { }
}
public sealed partial class HostApplicationBuilderSettings
{
public HostApplicationBuilderSettings() { }
public string ApplicationName { get { throw null; } set { } }
public string[] Args { get { throw null; } set { } }
public Microsoft.Extensions.Configuration.ConfigurationManager Configuration { get { throw null; } set { } }
public string ContentRootPath { get { throw null; } set { } }
public string? ApplicationName { get { throw null; } set { } }
public string[]? Args { get { throw null; } set { } }
public Microsoft.Extensions.Configuration.ConfigurationManager? Configuration { get { throw null; } set { } }
public string? ContentRootPath { get { throw null; } set { } }
public bool DisableDefaults { get { throw null; } set { } }
public string EnvironmentName { get { throw null; } set { } }
public string? EnvironmentName { get { throw null; } set { } }
}
public partial class HostBuilder : Microsoft.Extensions.Hosting.IHostBuilder
{
Expand All @@ -61,14 +61,14 @@ public HostBuilder() { }
public Microsoft.Extensions.Hosting.IHostBuilder ConfigureContainer<TContainerBuilder>(System.Action<Microsoft.Extensions.Hosting.HostBuilderContext, TContainerBuilder> configureDelegate) { throw null; }
public Microsoft.Extensions.Hosting.IHostBuilder ConfigureHostConfiguration(System.Action<Microsoft.Extensions.Configuration.IConfigurationBuilder> configureDelegate) { throw null; }
public Microsoft.Extensions.Hosting.IHostBuilder ConfigureServices(System.Action<Microsoft.Extensions.Hosting.HostBuilderContext, Microsoft.Extensions.DependencyInjection.IServiceCollection> configureDelegate) { throw null; }
public Microsoft.Extensions.Hosting.IHostBuilder UseServiceProviderFactory<TContainerBuilder>(Microsoft.Extensions.DependencyInjection.IServiceProviderFactory<TContainerBuilder> factory) { throw null; }
public Microsoft.Extensions.Hosting.IHostBuilder UseServiceProviderFactory<TContainerBuilder>(System.Func<Microsoft.Extensions.Hosting.HostBuilderContext, Microsoft.Extensions.DependencyInjection.IServiceProviderFactory<TContainerBuilder>> factory) { throw null; }
public Microsoft.Extensions.Hosting.IHostBuilder UseServiceProviderFactory<TContainerBuilder>(Microsoft.Extensions.DependencyInjection.IServiceProviderFactory<TContainerBuilder> factory) where TContainerBuilder : notnull { throw null; }
public Microsoft.Extensions.Hosting.IHostBuilder UseServiceProviderFactory<TContainerBuilder>(System.Func<Microsoft.Extensions.Hosting.HostBuilderContext, Microsoft.Extensions.DependencyInjection.IServiceProviderFactory<TContainerBuilder>> factory) where TContainerBuilder : notnull { throw null; }
}
public static partial class HostingHostBuilderExtensions
{
public static Microsoft.Extensions.Hosting.IHostBuilder ConfigureAppConfiguration(this Microsoft.Extensions.Hosting.IHostBuilder hostBuilder, System.Action<Microsoft.Extensions.Configuration.IConfigurationBuilder> configureDelegate) { throw null; }
public static Microsoft.Extensions.Hosting.IHostBuilder ConfigureContainer<TContainerBuilder>(this Microsoft.Extensions.Hosting.IHostBuilder hostBuilder, System.Action<TContainerBuilder> configureDelegate) { throw null; }
public static Microsoft.Extensions.Hosting.IHostBuilder ConfigureDefaults(this Microsoft.Extensions.Hosting.IHostBuilder builder, string[] args) { throw null; }
public static Microsoft.Extensions.Hosting.IHostBuilder ConfigureDefaults(this Microsoft.Extensions.Hosting.IHostBuilder builder, string[]? args) { throw null; }
public static Microsoft.Extensions.Hosting.IHostBuilder ConfigureHostOptions(this Microsoft.Extensions.Hosting.IHostBuilder hostBuilder, System.Action<Microsoft.Extensions.Hosting.HostBuilderContext, Microsoft.Extensions.Hosting.HostOptions> configureOptions) { throw null; }
public static Microsoft.Extensions.Hosting.IHostBuilder ConfigureHostOptions(this Microsoft.Extensions.Hosting.IHostBuilder hostBuilder, System.Action<Microsoft.Extensions.Hosting.HostOptions> configureOptions) { throw null; }
public static Microsoft.Extensions.Hosting.IHostBuilder ConfigureLogging(this Microsoft.Extensions.Hosting.IHostBuilder hostBuilder, System.Action<Microsoft.Extensions.Hosting.HostBuilderContext, Microsoft.Extensions.Logging.ILoggingBuilder> configureLogging) { throw null; }
Expand Down Expand Up @@ -102,8 +102,8 @@ public static partial class HostingHostBuilderExtensions
public partial class HostOptions
{
public HostOptions() { }
public System.TimeSpan ShutdownTimeout { get { throw null; } set { } }
public Microsoft.Extensions.Hosting.BackgroundServiceExceptionBehavior BackgroundServiceExceptionBehavior { get { throw null; } set { } }
public System.TimeSpan ShutdownTimeout { get { throw null; } set { } }
}
}
namespace Microsoft.Extensions.Hosting.Internal
Expand Down Expand Up @@ -133,7 +133,7 @@ public void Dispose() { }
public partial class HostingEnvironment : Microsoft.Extensions.Hosting.IHostEnvironment, Microsoft.Extensions.Hosting.IHostingEnvironment
{
public HostingEnvironment() { }
public string ApplicationName { get { throw null; } set { } }
public string? ApplicationName { get { throw null; } set { } }
public Microsoft.Extensions.FileProviders.IFileProvider ContentRootFileProvider { get { throw null; } set { } }
public string ContentRootPath { get { throw null; } set { } }
public string EnvironmentName { get { throw null; } set { } }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>$(NetCoreAppCurrent);$(NetCoreAppMinimum);netstandard2.1;netstandard2.0;$(NetFrameworkMinimum)</TargetFrameworks>
<Nullable>enable</Nullable>
<NoWarn>$(NoWarn);CS0618</NoWarn>
</PropertyGroup>

Expand Down
4 changes: 1 addition & 3 deletions src/libraries/Microsoft.Extensions.Hosting/src/Host.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,12 @@ public static IHostBuilder CreateDefaultBuilder() =>
/// </remarks>
/// <param name="args">The command line args.</param>
/// <returns>The initialized <see cref="IHostBuilder"/>.</returns>
public static IHostBuilder CreateDefaultBuilder(string[] args)
public static IHostBuilder CreateDefaultBuilder(string[]? args)
{
HostBuilder builder = new();
return builder.ConfigureDefaults(args);
}

#nullable enable
/// <summary>
/// Initializes a new instance of the <see cref="HostApplicationBuilder"/> class with pre-configured defaults.
/// </summary>
Expand Down Expand Up @@ -95,6 +94,5 @@ public static IHostBuilder CreateDefaultBuilder(string[] args)
/// </remarks>
/// <param name="args">The command line args.</param>
public static HostApplicationBuilder CreateApplicationBuilder(string[]? args) => new HostApplicationBuilder(args);
#nullable disable
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable enable

using System;
using System.Collections;
using System.Collections.Generic;
Expand Down Expand Up @@ -130,7 +128,7 @@ public HostApplicationBuilder(HostApplicationBuilderSettings? settings)
hostingEnvironment,
physicalFileProvider,
Configuration,
() => _appServices);
() => _appServices!);

Logging = new LoggingBuilder(Services);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable enable

using System.IO;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
Expand Down
57 changes: 32 additions & 25 deletions src/libraries/Microsoft.Extensions.Hosting/src/HostBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,12 @@ public partial class HostBuilder : IHostBuilder
private List<IConfigureContainerAdapter> _configureContainerActions = new List<IConfigureContainerAdapter>();
private IServiceFactoryAdapter _serviceProviderFactory = new ServiceFactoryAdapter<IServiceCollection>(new DefaultServiceProviderFactory());
private bool _hostBuilt;
private IConfiguration _hostConfiguration;
private IConfiguration _appConfiguration;
private HostBuilderContext _hostBuilderContext;
private HostingEnvironment _hostingEnvironment;
private IServiceProvider _appServices;
private PhysicalFileProvider _defaultProvider;
private IConfiguration? _hostConfiguration;
private IConfiguration? _appConfiguration;
private HostBuilderContext? _hostBuilderContext;
private HostingEnvironment? _hostingEnvironment;
private IServiceProvider? _appServices;
private PhysicalFileProvider? _defaultProvider;

/// <summary>
/// A central location for sharing state between components during the host building process.
Expand Down Expand Up @@ -88,7 +88,7 @@ public IHostBuilder ConfigureServices(Action<HostBuilderContext, IServiceCollect
/// <typeparam name="TContainerBuilder">The type of the builder to create.</typeparam>
/// <param name="factory">A factory used for creating service providers.</param>
/// <returns>The same instance of the <see cref="IHostBuilder"/> for chaining.</returns>
public IHostBuilder UseServiceProviderFactory<TContainerBuilder>(IServiceProviderFactory<TContainerBuilder> factory!!)
public IHostBuilder UseServiceProviderFactory<TContainerBuilder>(IServiceProviderFactory<TContainerBuilder> factory!!) where TContainerBuilder : notnull
{
_serviceProviderFactory = new ServiceFactoryAdapter<TContainerBuilder>(factory);
return this;
Expand All @@ -100,9 +100,9 @@ public IHostBuilder UseServiceProviderFactory<TContainerBuilder>(IServiceProvide
/// <param name="factory">A factory used for creating service providers.</param>
/// <typeparam name="TContainerBuilder">The type of the builder to create.</typeparam>
/// <returns>The same instance of the <see cref="IHostBuilder"/> for chaining.</returns>
public IHostBuilder UseServiceProviderFactory<TContainerBuilder>(Func<HostBuilderContext, IServiceProviderFactory<TContainerBuilder>> factory!!)
public IHostBuilder UseServiceProviderFactory<TContainerBuilder>(Func<HostBuilderContext, IServiceProviderFactory<TContainerBuilder>> factory!!) where TContainerBuilder : notnull
{
_serviceProviderFactory = new ServiceFactoryAdapter<TContainerBuilder>(() => _hostBuilderContext, factory);
_serviceProviderFactory = new ServiceFactoryAdapter<TContainerBuilder>(() => _hostBuilderContext!, factory);
return this;
}

Expand Down Expand Up @@ -180,6 +180,7 @@ private static void Write<T>(
diagnosticSource.Write(name, value);
}

[MemberNotNull(nameof(_hostConfiguration))]
private void InitializeHostConfiguration()
{
IConfigurationBuilder configBuilder = new ConfigurationBuilder()
Expand All @@ -192,9 +193,11 @@ private void InitializeHostConfiguration()
_hostConfiguration = configBuilder.Build();
}

[MemberNotNull(nameof(_defaultProvider))]
[MemberNotNull(nameof(_hostingEnvironment))]
private void InitializeHostingEnvironment()
{
(_hostingEnvironment, _defaultProvider) = CreateHostingEnvironment(_hostConfiguration);
(_hostingEnvironment, _defaultProvider) = CreateHostingEnvironment(_hostConfiguration!); // TODO-NULLABLE: https://github.com/dotnet/csharplang/discussions/5778. The same pattern exists below as well.
}

internal static (HostingEnvironment, PhysicalFileProvider) CreateHostingEnvironment(IConfiguration hostConfiguration)
Expand All @@ -218,7 +221,7 @@ internal static (HostingEnvironment, PhysicalFileProvider) CreateHostingEnvironm
return (hostingEnvironment, physicalFileProvider);
}

internal static string ResolveContentRootPath(string contentRootPath, string basePath)
internal static string ResolveContentRootPath(string? contentRootPath, string basePath)
{
if (string.IsNullOrEmpty(contentRootPath))
{
Expand All @@ -231,29 +234,32 @@ internal static string ResolveContentRootPath(string contentRootPath, string bas
return Path.Combine(Path.GetFullPath(basePath), contentRootPath);
}

[MemberNotNull(nameof(_hostBuilderContext))]
private void InitializeHostBuilderContext()
{
_hostBuilderContext = new HostBuilderContext(Properties)
{
HostingEnvironment = _hostingEnvironment,
Configuration = _hostConfiguration
HostingEnvironment = _hostingEnvironment!,
Configuration = _hostConfiguration!
};
}

[MemberNotNull(nameof(_appConfiguration))]
private void InitializeAppConfiguration()
{
IConfigurationBuilder configBuilder = new ConfigurationBuilder()
.SetBasePath(_hostingEnvironment.ContentRootPath)
.AddConfiguration(_hostConfiguration, shouldDisposeConfiguration: true);
.SetBasePath(_hostingEnvironment!.ContentRootPath)
.AddConfiguration(_hostConfiguration!, shouldDisposeConfiguration: true);

foreach (Action<HostBuilderContext, IConfigurationBuilder> buildAction in _configureAppConfigActions)
{
buildAction(_hostBuilderContext, configBuilder);
buildAction(_hostBuilderContext!, configBuilder);
}
_appConfiguration = configBuilder.Build();
_hostBuilderContext.Configuration = _appConfiguration;
_hostBuilderContext!.Configuration = _appConfiguration;
}

[MemberNotNull(nameof(_appServices))]
internal static void PopulateServiceCollection(
IServiceCollection services,
HostBuilderContext hostBuilderContext,
Expand All @@ -270,7 +276,7 @@ internal static void PopulateServiceCollection(
// register configuration as factory to make it dispose with the service provider
services.AddSingleton(_ => appConfiguration);
#pragma warning disable CS0618 // Type or member is obsolete
services.AddSingleton(s => (IApplicationLifetime)s.GetService<IHostApplicationLifetime>());
services.AddSingleton(s => (IApplicationLifetime)s.GetRequiredService<IHostApplicationLifetime>());
#pragma warning restore CS0618 // Type or member is obsolete
services.AddSingleton<IHostApplicationLifetime, ApplicationLifetime>();

Expand All @@ -294,28 +300,29 @@ internal static void PopulateServiceCollection(
services.AddLogging();
}

[MemberNotNull(nameof(_appServices))]
private void InitializeServiceProvider()
{
var services = new ServiceCollection();

PopulateServiceCollection(
services,
_hostBuilderContext,
_hostingEnvironment,
_defaultProvider,
_appConfiguration,
() => _appServices);
_hostBuilderContext!,
_hostingEnvironment!,
_defaultProvider!,
_appConfiguration!,
() => _appServices!);

foreach (Action<HostBuilderContext, IServiceCollection> configureServicesAction in _configureServicesActions)
{
configureServicesAction(_hostBuilderContext, services);
configureServicesAction(_hostBuilderContext!, services);
}

object containerBuilder = _serviceProviderFactory.CreateBuilder(services);

foreach (IConfigureContainerAdapter containerAction in _configureContainerActions)
{
containerAction.ConfigureContainer(_hostBuilderContext, containerBuilder);
containerAction.ConfigureContainer(_hostBuilderContext!, containerBuilder);
}

_appServices = _serviceProviderFactory.CreateServiceProvider(containerBuilder);
Expand Down
Loading