Skip to content

Implement IHostApplicationBuilder on WebApplicationBuilder #48775

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 1 commit into from
Jun 15, 2023
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
11 changes: 10 additions & 1 deletion src/DefaultBuilder/src/WebApplicationBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Builder;
/// <summary>
/// A builder for web applications and services.
/// </summary>
public sealed class WebApplicationBuilder
public sealed class WebApplicationBuilder : IHostApplicationBuilder
{
private const string EndpointRouteBuilderKey = "__EndpointRouteBuilder";
private const string AuthenticationMiddlewareSetKey = "__AuthenticationMiddlewareSet";
Expand Down Expand Up @@ -300,6 +300,12 @@ private static void AddDefaultServicesSlim(ConfigurationManager configuration, I
/// </summary>
public ConfigureHostBuilder Host { get; }

IDictionary<object, object> IHostApplicationBuilder.Properties => ((IHostApplicationBuilder)_hostApplicationBuilder).Properties;

IConfigurationManager IHostApplicationBuilder.Configuration => Configuration;

IHostEnvironment IHostApplicationBuilder.Environment => Environment;

/// <summary>
/// Builds the <see cref="WebApplication"/>.
/// </summary>
Expand Down Expand Up @@ -407,4 +413,7 @@ private void ConfigureApplication(WebHostBuilderContext context, IApplicationBui
app.Properties[EndpointRouteBuilderKey] = priorRouteBuilder;
}
}

void IHostApplicationBuilder.ConfigureContainer<TContainerBuilder>(IServiceProviderFactory<TContainerBuilder> factory, Action<TContainerBuilder>? configure) =>
_hostApplicationBuilder.ConfigureContainer(factory, configure);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2368,6 +2368,29 @@ public async Task SupportsDisablingMiddlewareAutoRegistration(CreateBuilderFunc
Assert.True(app.Properties.ContainsKey("__AuthorizationMiddlewareSet"));
}

[Theory]
[MemberData(nameof(CreateBuilderFuncs))]
public void ImplementsIHostApplicationBuilderCorrectly(CreateBuilderFunc createBuilder)
{
var builder = createBuilder();
var iHostApplicationBuilder = (IHostApplicationBuilder)builder;

builder.Host.Properties["MyProp"] = 1;
Assert.Equal(1, iHostApplicationBuilder.Properties["MyProp"]);

Assert.Same(builder.Host.Properties, iHostApplicationBuilder.Properties);
Assert.Same(builder.Configuration, iHostApplicationBuilder.Configuration);
Assert.Same(builder.Logging, iHostApplicationBuilder.Logging);
Assert.Same(builder.Services, iHostApplicationBuilder.Services);
Assert.True(iHostApplicationBuilder.Environment.IsProduction());
Assert.NotNull(iHostApplicationBuilder.Environment.ContentRootFileProvider);

iHostApplicationBuilder.ConfigureContainer(new MyServiceProviderFactory());

var app = builder.Build();
Assert.IsType<MyServiceProvider>(app.Services);
}

[Fact]
public async Task UsingCreateBuilderResultsInRegexConstraintBeingPresent()
{
Expand Down Expand Up @@ -2829,4 +2852,25 @@ public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
};
}
}

private class MyServiceProviderFactory : IServiceProviderFactory<MyServiceProvider>
{
public MyServiceProvider CreateBuilder(IServiceCollection services) => new MyServiceProvider(services);

public IServiceProvider CreateServiceProvider(MyServiceProvider containerBuilder)
{
containerBuilder.Build();
return containerBuilder;
}
}

private class MyServiceProvider : IServiceProvider
{
private IServiceProvider _inner;
private IServiceCollection _services;

public MyServiceProvider(IServiceCollection services) => _services = services;
public void Build() => _inner = _services.BuildServiceProvider();
public object GetService(Type serviceType) => _inner.GetService(serviceType);
}
}