Skip to content

Commit

Permalink
Implement IHostApplicationBuilder on WebApplicationBuilder (#48775)
Browse files Browse the repository at this point in the history
dotnet/runtime#86974 added support for a common interface between HostApplicationBuilder and WebApplicationBuilder. This implements the new interface on WebApplicationBuilder.
  • Loading branch information
eerhardt authored Jun 15, 2023
1 parent 5996cb5 commit 1ac7ae5
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 1 deletion.
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);
}
}

0 comments on commit 1ac7ae5

Please sign in to comment.