Skip to content

Commit c788f3b

Browse files
committed
Make Configure(Web)?HostBuilder public
- simplify sample
1 parent 0c6b958 commit c788f3b

File tree

8 files changed

+328
-252
lines changed

8 files changed

+328
-252
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using Microsoft.Extensions.Configuration;
7+
using Microsoft.Extensions.DependencyInjection;
8+
using Microsoft.Extensions.Hosting;
9+
10+
namespace Microsoft.AspNetCore.Builder
11+
{
12+
/// <summary>
13+
/// A non-buildable <see cref="IHostBuilder"/> for <see cref="WebApplicationBuilder"/>.
14+
/// Use <see cref="WebApplicationBuilder.Build"/> to build the <see cref="WebApplicationBuilder"/>.
15+
/// </summary>
16+
public sealed class ConfigureHostBuilder : IHostBuilder
17+
{
18+
private Action<IHostBuilder>? _operations;
19+
20+
/// <inheritdoc />
21+
public IDictionary<object, object> Properties { get; } = new Dictionary<object, object>();
22+
23+
internal Configuration Configuration => _configuration;
24+
25+
private readonly IConfigurationBuilder _hostConfiguration = new ConfigurationBuilder();
26+
27+
private readonly WebHostEnvironment _environment;
28+
private readonly Configuration _configuration;
29+
private readonly IServiceCollection _services;
30+
31+
internal ConfigureHostBuilder(Configuration configuration, WebHostEnvironment environment, IServiceCollection services, string[]? args)
32+
{
33+
_configuration = configuration;
34+
_environment = environment;
35+
_services = services;
36+
37+
this.ConfigureDefaults(args);
38+
}
39+
40+
IHost IHostBuilder.Build()
41+
{
42+
throw new NotSupportedException($"Call {nameof(WebApplicationBuilder)}.{nameof(WebApplicationBuilder.Build)}() instead.");
43+
}
44+
45+
/// <inheritdoc />
46+
public IHostBuilder ConfigureAppConfiguration(Action<HostBuilderContext, IConfigurationBuilder> configureDelegate)
47+
{
48+
_operations += b => b.ConfigureAppConfiguration(configureDelegate);
49+
return this;
50+
}
51+
52+
/// <inheritdoc />
53+
public IHostBuilder ConfigureContainer<TContainerBuilder>(Action<HostBuilderContext, TContainerBuilder> configureDelegate)
54+
{
55+
_operations += b => b.ConfigureContainer(configureDelegate);
56+
return this;
57+
}
58+
59+
/// <inheritdoc />
60+
public IHostBuilder ConfigureHostConfiguration(Action<IConfigurationBuilder> configureDelegate)
61+
{
62+
// HACK: We need to evaluate the host configuration as they are changes so that we have an accurate view of the world
63+
configureDelegate(_hostConfiguration);
64+
65+
var config = _hostConfiguration.Build();
66+
67+
_environment.ApplicationName = config[HostDefaults.ApplicationKey] ?? _environment.ApplicationName;
68+
_environment.ContentRootPath = config[HostDefaults.ContentRootKey] ?? _environment.ContentRootPath;
69+
_environment.EnvironmentName = config[HostDefaults.EnvironmentKey] ?? _environment.EnvironmentName;
70+
_environment.ResolveFileProviders(config);
71+
Configuration.ChangeBasePath(_environment.ContentRootPath);
72+
73+
_operations += b => b.ConfigureHostConfiguration(configureDelegate);
74+
return this;
75+
}
76+
77+
/// <inheritdoc />
78+
public IHostBuilder ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate)
79+
{
80+
// Run these immediately so that they are observable by the imperative code
81+
configureDelegate(new HostBuilderContext(Properties)
82+
{
83+
Configuration = Configuration,
84+
HostingEnvironment = _environment
85+
},
86+
_services);
87+
88+
return this;
89+
}
90+
91+
/// <inheritdoc />
92+
public IHostBuilder UseServiceProviderFactory<TContainerBuilder>(IServiceProviderFactory<TContainerBuilder> factory) where TContainerBuilder : notnull
93+
{
94+
_operations += b => b.UseServiceProviderFactory(factory);
95+
return this;
96+
}
97+
98+
/// <inheritdoc />
99+
public IHostBuilder UseServiceProviderFactory<TContainerBuilder>(Func<HostBuilderContext, IServiceProviderFactory<TContainerBuilder>> factory) where TContainerBuilder : notnull
100+
{
101+
_operations += b => b.UseServiceProviderFactory(factory);
102+
return this;
103+
}
104+
105+
/// <inheritdoc />
106+
public void ExecuteActions(IHostBuilder hostBuilder)
107+
{
108+
_operations?.Invoke(hostBuilder);
109+
}
110+
}
111+
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using Microsoft.AspNetCore.Hosting;
7+
using Microsoft.Extensions.Configuration;
8+
using Microsoft.Extensions.DependencyInjection;
9+
10+
namespace Microsoft.AspNetCore.Builder
11+
{
12+
/// <summary>
13+
/// A non-buildable <see cref="IWebHostBuilder"/> for <see cref="WebApplicationBuilder"/>.
14+
/// Use <see cref="WebApplicationBuilder.Build"/> to build the <see cref="WebApplicationBuilder"/>.
15+
/// </summary>
16+
public sealed class ConfigureWebHostBuilder : IWebHostBuilder
17+
{
18+
private Action<IWebHostBuilder>? _operations;
19+
20+
private readonly WebHostEnvironment _environment;
21+
private readonly Configuration _configuration;
22+
private readonly Dictionary<string, string?> _settings = new Dictionary<string, string?>();
23+
private readonly IServiceCollection _services;
24+
25+
internal ConfigureWebHostBuilder(Configuration configuration, WebHostEnvironment environment, IServiceCollection services)
26+
{
27+
_configuration = configuration;
28+
_environment = environment;
29+
_services = services;
30+
}
31+
32+
IWebHost IWebHostBuilder.Build()
33+
{
34+
throw new NotSupportedException($"Call {nameof(WebApplicationBuilder)}.{nameof(WebApplicationBuilder.Build)}() instead.");
35+
}
36+
37+
/// <inheritdoc />
38+
public IWebHostBuilder ConfigureAppConfiguration(Action<WebHostBuilderContext, IConfigurationBuilder> configureDelegate)
39+
{
40+
_operations += b => b.ConfigureAppConfiguration(configureDelegate);
41+
return this;
42+
}
43+
44+
/// <inheritdoc />
45+
public IWebHostBuilder ConfigureServices(Action<WebHostBuilderContext, IServiceCollection> configureServices)
46+
{
47+
configureServices(new WebHostBuilderContext
48+
{
49+
Configuration = _configuration,
50+
HostingEnvironment = _environment
51+
},
52+
_services);
53+
return this;
54+
}
55+
56+
/// <inheritdoc />
57+
public IWebHostBuilder ConfigureServices(Action<IServiceCollection> configureServices)
58+
{
59+
return ConfigureServices((WebHostBuilderContext context, IServiceCollection services) => configureServices(services));
60+
}
61+
62+
/// <inheritdoc />
63+
public string? GetSetting(string key)
64+
{
65+
_settings.TryGetValue(key, out var value);
66+
return value;
67+
}
68+
69+
/// <inheritdoc />
70+
public IWebHostBuilder UseSetting(string key, string? value)
71+
{
72+
_settings[key] = value;
73+
_operations += b => b.UseSetting(key, value);
74+
75+
// All preoperties on IWebHostEnvironment are non-nullable.
76+
if (value is null)
77+
{
78+
return this;
79+
}
80+
81+
if (key == WebHostDefaults.ApplicationKey)
82+
{
83+
_environment.ApplicationName = value;
84+
}
85+
else if (key == WebHostDefaults.ContentRootKey)
86+
{
87+
_environment.ContentRootPath = value;
88+
_environment.ResolveFileProviders(_configuration);
89+
90+
_configuration.ChangeBasePath(value);
91+
}
92+
else if (key == WebHostDefaults.EnvironmentKey)
93+
{
94+
_environment.EnvironmentName = value;
95+
}
96+
else if (key == WebHostDefaults.WebRootKey)
97+
{
98+
_environment.WebRootPath = value;
99+
_environment.ResolveFileProviders(_configuration);
100+
}
101+
102+
return this;
103+
}
104+
105+
/// <inheritdoc />
106+
public void ExecuteActions(IWebHostBuilder webHostBuilder)
107+
{
108+
_operations?.Invoke(webHostBuilder);
109+
}
110+
}
111+
}

src/DefaultBuilder/src/PublicAPI.Unshipped.txt

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,22 @@ Microsoft.AspNetCore.Builder.Configuration.GetChildren() -> System.Collections.G
55
Microsoft.AspNetCore.Builder.Configuration.GetSection(string! key) -> Microsoft.Extensions.Configuration.IConfigurationSection!
66
Microsoft.AspNetCore.Builder.Configuration.this[string! key].get -> string!
77
Microsoft.AspNetCore.Builder.Configuration.this[string! key].set -> void
8+
Microsoft.AspNetCore.Builder.ConfigureHostBuilder
9+
Microsoft.AspNetCore.Builder.ConfigureHostBuilder.ConfigureAppConfiguration(System.Action<Microsoft.Extensions.Hosting.HostBuilderContext!, Microsoft.Extensions.Configuration.IConfigurationBuilder!>! configureDelegate) -> Microsoft.Extensions.Hosting.IHostBuilder!
10+
Microsoft.AspNetCore.Builder.ConfigureHostBuilder.ConfigureContainer<TContainerBuilder>(System.Action<Microsoft.Extensions.Hosting.HostBuilderContext!, TContainerBuilder>! configureDelegate) -> Microsoft.Extensions.Hosting.IHostBuilder!
11+
Microsoft.AspNetCore.Builder.ConfigureHostBuilder.ConfigureHostConfiguration(System.Action<Microsoft.Extensions.Configuration.IConfigurationBuilder!>! configureDelegate) -> Microsoft.Extensions.Hosting.IHostBuilder!
12+
Microsoft.AspNetCore.Builder.ConfigureHostBuilder.ConfigureServices(System.Action<Microsoft.Extensions.Hosting.HostBuilderContext!, Microsoft.Extensions.DependencyInjection.IServiceCollection!>! configureDelegate) -> Microsoft.Extensions.Hosting.IHostBuilder!
13+
Microsoft.AspNetCore.Builder.ConfigureHostBuilder.ExecuteActions(Microsoft.Extensions.Hosting.IHostBuilder! hostBuilder) -> void
14+
Microsoft.AspNetCore.Builder.ConfigureHostBuilder.Properties.get -> System.Collections.Generic.IDictionary<object!, object!>!
15+
Microsoft.AspNetCore.Builder.ConfigureHostBuilder.UseServiceProviderFactory<TContainerBuilder>(Microsoft.Extensions.DependencyInjection.IServiceProviderFactory<TContainerBuilder>! factory) -> Microsoft.Extensions.Hosting.IHostBuilder!
16+
Microsoft.AspNetCore.Builder.ConfigureHostBuilder.UseServiceProviderFactory<TContainerBuilder>(System.Func<Microsoft.Extensions.Hosting.HostBuilderContext!, Microsoft.Extensions.DependencyInjection.IServiceProviderFactory<TContainerBuilder>!>! factory) -> Microsoft.Extensions.Hosting.IHostBuilder!
17+
Microsoft.AspNetCore.Builder.ConfigureWebHostBuilder
18+
Microsoft.AspNetCore.Builder.ConfigureWebHostBuilder.ConfigureAppConfiguration(System.Action<Microsoft.AspNetCore.Hosting.WebHostBuilderContext!, Microsoft.Extensions.Configuration.IConfigurationBuilder!>! configureDelegate) -> Microsoft.AspNetCore.Hosting.IWebHostBuilder!
19+
Microsoft.AspNetCore.Builder.ConfigureWebHostBuilder.ConfigureServices(System.Action<Microsoft.AspNetCore.Hosting.WebHostBuilderContext!, Microsoft.Extensions.DependencyInjection.IServiceCollection!>! configureServices) -> Microsoft.AspNetCore.Hosting.IWebHostBuilder!
20+
Microsoft.AspNetCore.Builder.ConfigureWebHostBuilder.ConfigureServices(System.Action<Microsoft.Extensions.DependencyInjection.IServiceCollection!>! configureServices) -> Microsoft.AspNetCore.Hosting.IWebHostBuilder!
21+
Microsoft.AspNetCore.Builder.ConfigureWebHostBuilder.ExecuteActions(Microsoft.AspNetCore.Hosting.IWebHostBuilder! webHostBuilder) -> void
22+
Microsoft.AspNetCore.Builder.ConfigureWebHostBuilder.GetSetting(string! key) -> string?
23+
Microsoft.AspNetCore.Builder.ConfigureWebHostBuilder.UseSetting(string! key, string? value) -> Microsoft.AspNetCore.Hosting.IWebHostBuilder!
824
Microsoft.AspNetCore.Builder.WebApplication
925
Microsoft.AspNetCore.Builder.WebApplication.Addresses.get -> System.Collections.Generic.IEnumerable<string!>?
1026
Microsoft.AspNetCore.Builder.WebApplication.Configuration.get -> Microsoft.Extensions.Configuration.IConfiguration!
@@ -24,10 +40,10 @@ Microsoft.AspNetCore.Builder.WebApplicationBuilder
2440
Microsoft.AspNetCore.Builder.WebApplicationBuilder.Build() -> Microsoft.AspNetCore.Builder.WebApplication!
2541
Microsoft.AspNetCore.Builder.WebApplicationBuilder.Configuration.get -> Microsoft.AspNetCore.Builder.Configuration!
2642
Microsoft.AspNetCore.Builder.WebApplicationBuilder.Environment.get -> Microsoft.AspNetCore.Hosting.IWebHostEnvironment!
27-
Microsoft.AspNetCore.Builder.WebApplicationBuilder.Host.get -> Microsoft.Extensions.Hosting.IHostBuilder!
43+
Microsoft.AspNetCore.Builder.WebApplicationBuilder.Host.get -> Microsoft.AspNetCore.Builder.ConfigureHostBuilder!
2844
Microsoft.AspNetCore.Builder.WebApplicationBuilder.Logging.get -> Microsoft.Extensions.Logging.ILoggingBuilder!
2945
Microsoft.AspNetCore.Builder.WebApplicationBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
30-
Microsoft.AspNetCore.Builder.WebApplicationBuilder.WebHost.get -> Microsoft.AspNetCore.Hosting.IWebHostBuilder!
46+
Microsoft.AspNetCore.Builder.WebApplicationBuilder.WebHost.get -> Microsoft.AspNetCore.Builder.ConfigureWebHostBuilder!
3147
static Microsoft.AspNetCore.Builder.WebApplication.Create() -> Microsoft.AspNetCore.Builder.WebApplication!
3248
static Microsoft.AspNetCore.Builder.WebApplication.Create(string![]! args) -> Microsoft.AspNetCore.Builder.WebApplication!
3349
static Microsoft.AspNetCore.Builder.WebApplication.CreateBuilder() -> Microsoft.AspNetCore.Builder.WebApplicationBuilder!

src/DefaultBuilder/src/WebApplication.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
using Microsoft.Extensions.Hosting;
1818
using Microsoft.Extensions.Logging;
1919

20-
// REVIEW: Or just "Microsoft.AspNetCore" like WebHost?
2120
namespace Microsoft.AspNetCore.Builder
2221
{
2322
/// <summary>

0 commit comments

Comments
 (0)