Skip to content

Commit 0d0c971

Browse files
committed
Add GenericWebHostService after user code #11437
1 parent 9016794 commit 0d0c971

File tree

4 files changed

+77
-2
lines changed

4 files changed

+77
-2
lines changed

src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ public GenericWebHostBuilder(IHostBuilder builder)
7575
options.HostingStartupExceptions = _hostingStartupErrors;
7676
});
7777

78-
services.AddHostedService<GenericWebHostService>();
79-
8078
// REVIEW: This is bad since we don't own this type. Anybody could add one of these and it would mess things up
8179
// We need to flow this differently
8280
var listener = new DiagnosticListener("Microsoft.AspNetCore");

src/Hosting/Hosting/src/GenericHostWebHostBuilderExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using Microsoft.AspNetCore.Hosting;
3+
using Microsoft.Extensions.DependencyInjection;
34

45
namespace Microsoft.Extensions.Hosting
56
{
@@ -9,6 +10,7 @@ public static IHostBuilder ConfigureWebHost(this IHostBuilder builder, Action<IW
910
{
1011
var webhostBuilder = new GenericWebHostBuilder(builder);
1112
configure(webhostBuilder);
13+
builder.ConfigureServices((context, services) => services.AddHostedService<GenericWebHostService>());
1214
return builder;
1315
}
1416
}

src/Hosting/Hosting/test/Fakes/GenericWebHostBuilderWrapper.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ internal GenericWebHostBuilderWrapper(HostBuilder hostBuilder)
2323
// This is the only one that doesn't pass through
2424
public IWebHost Build()
2525
{
26+
_hostBuilder.ConfigureServices((context, services) => services.AddHostedService<GenericWebHostService>());
2627
return new GenericWebHost(_hostBuilder.Build());
2728
}
2829

src/Hosting/Hosting/test/WebHostBuilderTests.cs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,6 +1271,80 @@ public async Task ThrowingFromHostedServiceStopsOtherHostedServicesFromRunningSt
12711271
Assert.True(service.StopCalled);
12721272
}
12731273

1274+
[Theory]
1275+
[MemberData(nameof(DefaultWebHostBuilders))]
1276+
public async Task HostedServicesStartedBeforeServer(IWebHostBuilder builder)
1277+
{
1278+
builder.Configure(app => { })
1279+
.ConfigureServices(services =>
1280+
{
1281+
services.AddSingleton<StartOrder>();
1282+
services.AddHostedService<MustBeStartedFirst>();
1283+
services.AddSingleton<IServer, ServerMustBeStartedSecond>();
1284+
});
1285+
1286+
using var host = builder.Build();
1287+
await host.StartAsync();
1288+
var ordering = host.Services.GetRequiredService<StartOrder>();
1289+
Assert.Equal(2, ordering.Order);
1290+
await host.StopAsync();
1291+
}
1292+
1293+
private class StartOrder
1294+
{
1295+
public int Order { get; set; }
1296+
}
1297+
1298+
private class MustBeStartedFirst : IHostedService
1299+
{
1300+
public MustBeStartedFirst(StartOrder ordering)
1301+
{
1302+
Ordering = ordering;
1303+
}
1304+
1305+
public StartOrder Ordering { get; }
1306+
1307+
public Task StartAsync(CancellationToken cancellationToken)
1308+
{
1309+
Assert.Equal(0, Ordering.Order);
1310+
Ordering.Order++;
1311+
return Task.CompletedTask;
1312+
}
1313+
1314+
public Task StopAsync(CancellationToken cancellationToken)
1315+
{
1316+
return Task.CompletedTask;
1317+
}
1318+
}
1319+
1320+
private class ServerMustBeStartedSecond : IServer
1321+
{
1322+
public ServerMustBeStartedSecond(StartOrder ordering)
1323+
{
1324+
Ordering = ordering;
1325+
}
1326+
1327+
public StartOrder Ordering { get; }
1328+
1329+
public IFeatureCollection Features => null;
1330+
1331+
public Task StartAsync<TContext>(IHttpApplication<TContext> application, CancellationToken cancellationToken)
1332+
{
1333+
Assert.Equal(1, Ordering.Order);
1334+
Ordering.Order++;
1335+
return Task.CompletedTask;
1336+
}
1337+
1338+
public Task StopAsync(CancellationToken cancellationToken)
1339+
{
1340+
return Task.CompletedTask;
1341+
}
1342+
1343+
public void Dispose()
1344+
{
1345+
}
1346+
}
1347+
12741348
private static void StaticConfigureMethod(IApplicationBuilder app) { }
12751349

12761350
private IWebHostBuilder CreateWebHostBuilder()

0 commit comments

Comments
 (0)