From 0d0c971fba73909971e4f2f683bbcc9a62d3de44 Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 25 Jun 2019 16:25:53 -0700 Subject: [PATCH] Add GenericWebHostService after user code #11437 --- .../src/GenericHost/GenericWebHostBuilder.cs | 2 - .../GenericHostWebHostBuilderExtensions.cs | 2 + .../Fakes/GenericWebHostBuilderWrapper.cs | 1 + .../Hosting/test/WebHostBuilderTests.cs | 74 +++++++++++++++++++ 4 files changed, 77 insertions(+), 2 deletions(-) diff --git a/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs b/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs index 8af0174431b6..ae1ea928168a 100644 --- a/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs +++ b/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs @@ -75,8 +75,6 @@ public GenericWebHostBuilder(IHostBuilder builder) options.HostingStartupExceptions = _hostingStartupErrors; }); - services.AddHostedService(); - // REVIEW: This is bad since we don't own this type. Anybody could add one of these and it would mess things up // We need to flow this differently var listener = new DiagnosticListener("Microsoft.AspNetCore"); diff --git a/src/Hosting/Hosting/src/GenericHostWebHostBuilderExtensions.cs b/src/Hosting/Hosting/src/GenericHostWebHostBuilderExtensions.cs index e2610777f0b3..feb6da2ca4ba 100644 --- a/src/Hosting/Hosting/src/GenericHostWebHostBuilderExtensions.cs +++ b/src/Hosting/Hosting/src/GenericHostWebHostBuilderExtensions.cs @@ -1,5 +1,6 @@ using System; using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.Extensions.Hosting { @@ -9,6 +10,7 @@ public static IHostBuilder ConfigureWebHost(this IHostBuilder builder, Action services.AddHostedService()); return builder; } } diff --git a/src/Hosting/Hosting/test/Fakes/GenericWebHostBuilderWrapper.cs b/src/Hosting/Hosting/test/Fakes/GenericWebHostBuilderWrapper.cs index 096a18cf77a0..876cc7199b07 100644 --- a/src/Hosting/Hosting/test/Fakes/GenericWebHostBuilderWrapper.cs +++ b/src/Hosting/Hosting/test/Fakes/GenericWebHostBuilderWrapper.cs @@ -23,6 +23,7 @@ internal GenericWebHostBuilderWrapper(HostBuilder hostBuilder) // This is the only one that doesn't pass through public IWebHost Build() { + _hostBuilder.ConfigureServices((context, services) => services.AddHostedService()); return new GenericWebHost(_hostBuilder.Build()); } diff --git a/src/Hosting/Hosting/test/WebHostBuilderTests.cs b/src/Hosting/Hosting/test/WebHostBuilderTests.cs index ae7e111b2d5c..dc128dc50aba 100644 --- a/src/Hosting/Hosting/test/WebHostBuilderTests.cs +++ b/src/Hosting/Hosting/test/WebHostBuilderTests.cs @@ -1271,6 +1271,80 @@ public async Task ThrowingFromHostedServiceStopsOtherHostedServicesFromRunningSt Assert.True(service.StopCalled); } + [Theory] + [MemberData(nameof(DefaultWebHostBuilders))] + public async Task HostedServicesStartedBeforeServer(IWebHostBuilder builder) + { + builder.Configure(app => { }) + .ConfigureServices(services => + { + services.AddSingleton(); + services.AddHostedService(); + services.AddSingleton(); + }); + + using var host = builder.Build(); + await host.StartAsync(); + var ordering = host.Services.GetRequiredService(); + Assert.Equal(2, ordering.Order); + await host.StopAsync(); + } + + private class StartOrder + { + public int Order { get; set; } + } + + private class MustBeStartedFirst : IHostedService + { + public MustBeStartedFirst(StartOrder ordering) + { + Ordering = ordering; + } + + public StartOrder Ordering { get; } + + public Task StartAsync(CancellationToken cancellationToken) + { + Assert.Equal(0, Ordering.Order); + Ordering.Order++; + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } + } + + private class ServerMustBeStartedSecond : IServer + { + public ServerMustBeStartedSecond(StartOrder ordering) + { + Ordering = ordering; + } + + public StartOrder Ordering { get; } + + public IFeatureCollection Features => null; + + public Task StartAsync(IHttpApplication application, CancellationToken cancellationToken) + { + Assert.Equal(1, Ordering.Order); + Ordering.Order++; + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } + + public void Dispose() + { + } + } + private static void StaticConfigureMethod(IApplicationBuilder app) { } private IWebHostBuilder CreateWebHostBuilder()