Skip to content

Commit 7c8518a

Browse files
authored
Make the IServiceCollection work (#38)
* Make the IServiceCollection work - Eagerly evaluate callbacks that have to do with the services so that they are visible to the caller using WebApplicationBuilder.Services. * Fix webhostbuilder too
1 parent e556685 commit 7c8518a

File tree

1 file changed

+40
-23
lines changed

1 file changed

+40
-23
lines changed

src/FeatherHttp/WebApplicationBuilder.cs

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ internal WebApplicationBuilder(Assembly callingAssembly, Action<IHostBuilder> co
4747

4848
Configuration.SetBasePath(environment.ContentRootPath);
4949
Logging = new LoggingBuilder(Services);
50-
Server = _deferredWebHostBuilder = new DeferredWebHostBuilder(Configuration, environment);
51-
Host = _deferredHostBuilder = new DeferredHostBuilder(Configuration, configureHost, environment);
50+
Server = _deferredWebHostBuilder = new DeferredWebHostBuilder(Configuration, environment, Services);
51+
Host = _deferredHostBuilder = new DeferredHostBuilder(Configuration, configureHost, environment, Services);
5252
}
5353

5454
/// <summary>
@@ -89,6 +89,22 @@ public WebApplication Build()
8989
{
9090
WebApplication sourcePipeline = null;
9191

92+
_hostBuilder.ConfigureServices(services =>
93+
{
94+
foreach (var s in Services)
95+
{
96+
services.Add(s);
97+
}
98+
});
99+
100+
_hostBuilder.ConfigureAppConfiguration((hostContext, builder) =>
101+
{
102+
foreach (var s in Configuration.Sources)
103+
{
104+
builder.Sources.Add(s);
105+
}
106+
});
107+
92108
_deferredHostBuilder.ExecuteActions(_hostBuilder);
93109

94110
_hostBuilder.ConfigureWebHostDefaults(web =>
@@ -163,22 +179,6 @@ public WebApplication Build()
163179
_deferredWebHostBuilder.ExecuteActions(web);
164180
});
165181

166-
_hostBuilder.ConfigureServices(services =>
167-
{
168-
foreach (var s in Services)
169-
{
170-
services.Add(s);
171-
}
172-
});
173-
174-
_hostBuilder.ConfigureAppConfiguration((hostContext, builder) =>
175-
{
176-
foreach (var s in Configuration.Sources)
177-
{
178-
builder.Sources.Add(s);
179-
}
180-
});
181-
182182
var host = _hostBuilder.Build();
183183

184184
return sourcePipeline = new WebApplication(host);
@@ -194,12 +194,15 @@ private class DeferredHostBuilder : IHostBuilder
194194

195195
private readonly WebHostEnvironment _environment;
196196
private readonly Configuration _configuration;
197+
private readonly IServiceCollection _services;
197198

198-
public DeferredHostBuilder(Configuration configuration, Action<IHostBuilder> configureHost, WebHostEnvironment environment)
199+
public DeferredHostBuilder(Configuration configuration, Action<IHostBuilder> configureHost, WebHostEnvironment environment, IServiceCollection services)
199200
{
200201
_configuration = configuration;
201202
_environment = environment;
202-
_operations += configureHost;
203+
_services = services;
204+
205+
configureHost(this);
203206
}
204207

205208
public IHost Build()
@@ -238,7 +241,14 @@ public IHostBuilder ConfigureHostConfiguration(Action<IConfigurationBuilder> con
238241

239242
public IHostBuilder ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate)
240243
{
241-
_operations += b => b.ConfigureServices(configureDelegate);
244+
// Run these immediately so that they are observable by the imperative code
245+
configureDelegate(new HostBuilderContext(Properties)
246+
{
247+
Configuration = _configuration,
248+
HostingEnvironment = _environment
249+
},
250+
_services);
251+
242252
return this;
243253
}
244254

@@ -267,11 +277,13 @@ private class DeferredWebHostBuilder : IWebHostBuilder
267277
private readonly WebHostEnvironment _environment;
268278
private readonly Configuration _configuration;
269279
private readonly Dictionary<string, string> _settings = new Dictionary<string, string>();
280+
private readonly IServiceCollection _services;
270281

271-
public DeferredWebHostBuilder(Configuration configuration, WebHostEnvironment environment)
282+
public DeferredWebHostBuilder(Configuration configuration, WebHostEnvironment environment, IServiceCollection services)
272283
{
273284
_configuration = configuration;
274285
_environment = environment;
286+
_services = services;
275287
}
276288

277289
IWebHost IWebHostBuilder.Build()
@@ -287,7 +299,12 @@ public IWebHostBuilder ConfigureAppConfiguration(Action<WebHostBuilderContext, I
287299

288300
public IWebHostBuilder ConfigureServices(Action<WebHostBuilderContext, IServiceCollection> configureServices)
289301
{
290-
_operations += b => b.ConfigureServices(configureServices);
302+
configureServices(new WebHostBuilderContext
303+
{
304+
Configuration = _configuration,
305+
HostingEnvironment = _environment
306+
},
307+
_services);
291308
return this;
292309
}
293310

0 commit comments

Comments
 (0)