Skip to content

Commit 1ac7ae5

Browse files
authored
Implement IHostApplicationBuilder on WebApplicationBuilder (#48775)
dotnet/runtime#86974 added support for a common interface between HostApplicationBuilder and WebApplicationBuilder. This implements the new interface on WebApplicationBuilder.
1 parent 5996cb5 commit 1ac7ae5

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

src/DefaultBuilder/src/WebApplicationBuilder.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Builder;
1616
/// <summary>
1717
/// A builder for web applications and services.
1818
/// </summary>
19-
public sealed class WebApplicationBuilder
19+
public sealed class WebApplicationBuilder : IHostApplicationBuilder
2020
{
2121
private const string EndpointRouteBuilderKey = "__EndpointRouteBuilder";
2222
private const string AuthenticationMiddlewareSetKey = "__AuthenticationMiddlewareSet";
@@ -300,6 +300,12 @@ private static void AddDefaultServicesSlim(ConfigurationManager configuration, I
300300
/// </summary>
301301
public ConfigureHostBuilder Host { get; }
302302

303+
IDictionary<object, object> IHostApplicationBuilder.Properties => ((IHostApplicationBuilder)_hostApplicationBuilder).Properties;
304+
305+
IConfigurationManager IHostApplicationBuilder.Configuration => Configuration;
306+
307+
IHostEnvironment IHostApplicationBuilder.Environment => Environment;
308+
303309
/// <summary>
304310
/// Builds the <see cref="WebApplication"/>.
305311
/// </summary>
@@ -407,4 +413,7 @@ private void ConfigureApplication(WebHostBuilderContext context, IApplicationBui
407413
app.Properties[EndpointRouteBuilderKey] = priorRouteBuilder;
408414
}
409415
}
416+
417+
void IHostApplicationBuilder.ConfigureContainer<TContainerBuilder>(IServiceProviderFactory<TContainerBuilder> factory, Action<TContainerBuilder>? configure) =>
418+
_hostApplicationBuilder.ConfigureContainer(factory, configure);
410419
}

src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/WebApplicationTests.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2368,6 +2368,29 @@ public async Task SupportsDisablingMiddlewareAutoRegistration(CreateBuilderFunc
23682368
Assert.True(app.Properties.ContainsKey("__AuthorizationMiddlewareSet"));
23692369
}
23702370

2371+
[Theory]
2372+
[MemberData(nameof(CreateBuilderFuncs))]
2373+
public void ImplementsIHostApplicationBuilderCorrectly(CreateBuilderFunc createBuilder)
2374+
{
2375+
var builder = createBuilder();
2376+
var iHostApplicationBuilder = (IHostApplicationBuilder)builder;
2377+
2378+
builder.Host.Properties["MyProp"] = 1;
2379+
Assert.Equal(1, iHostApplicationBuilder.Properties["MyProp"]);
2380+
2381+
Assert.Same(builder.Host.Properties, iHostApplicationBuilder.Properties);
2382+
Assert.Same(builder.Configuration, iHostApplicationBuilder.Configuration);
2383+
Assert.Same(builder.Logging, iHostApplicationBuilder.Logging);
2384+
Assert.Same(builder.Services, iHostApplicationBuilder.Services);
2385+
Assert.True(iHostApplicationBuilder.Environment.IsProduction());
2386+
Assert.NotNull(iHostApplicationBuilder.Environment.ContentRootFileProvider);
2387+
2388+
iHostApplicationBuilder.ConfigureContainer(new MyServiceProviderFactory());
2389+
2390+
var app = builder.Build();
2391+
Assert.IsType<MyServiceProvider>(app.Services);
2392+
}
2393+
23712394
[Fact]
23722395
public async Task UsingCreateBuilderResultsInRegexConstraintBeingPresent()
23732396
{
@@ -2829,4 +2852,25 @@ public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
28292852
};
28302853
}
28312854
}
2855+
2856+
private class MyServiceProviderFactory : IServiceProviderFactory<MyServiceProvider>
2857+
{
2858+
public MyServiceProvider CreateBuilder(IServiceCollection services) => new MyServiceProvider(services);
2859+
2860+
public IServiceProvider CreateServiceProvider(MyServiceProvider containerBuilder)
2861+
{
2862+
containerBuilder.Build();
2863+
return containerBuilder;
2864+
}
2865+
}
2866+
2867+
private class MyServiceProvider : IServiceProvider
2868+
{
2869+
private IServiceProvider _inner;
2870+
private IServiceCollection _services;
2871+
2872+
public MyServiceProvider(IServiceCollection services) => _services = services;
2873+
public void Build() => _inner = _services.BuildServiceProvider();
2874+
public object GetService(Type serviceType) => _inner.GetService(serviceType);
2875+
}
28322876
}

0 commit comments

Comments
 (0)