@@ -68,6 +68,54 @@ public async Task StartupStaticCtorThrows_Fallback(IWebHostBuilder builder)
6868 }
6969 }
7070
71+ [ Theory ]
72+ [ MemberData ( nameof ( DefaultWebHostBuildersWithConfig ) ) ]
73+ public async Task MultipleUseStartupCallsLastWins ( IWebHostBuilder builder )
74+ {
75+ var server = new TestServer ( ) ;
76+ var host = builder . UseServer ( server )
77+ . UseStartup < StartupCtorThrows > ( )
78+ . UseStartup ( context => throw new InvalidOperationException ( "This doesn't run" ) )
79+ . Configure ( app =>
80+ {
81+ throw new InvalidOperationException ( "This doesn't run" ) ;
82+ } )
83+ . Configure ( app =>
84+ {
85+ app . Run ( context =>
86+ {
87+ return context . Response . WriteAsync ( "This wins" ) ;
88+ } ) ;
89+ } )
90+ . Build ( ) ;
91+ using ( host )
92+ {
93+ await host . StartAsync ( ) ;
94+ await AssertResponseContains ( server . RequestDelegate , "This wins" ) ;
95+ }
96+ }
97+
98+ [ Theory ]
99+ [ MemberData ( nameof ( DefaultWebHostBuildersWithConfig ) ) ]
100+ public async Task UseStartupFactoryWorks ( IWebHostBuilder builder )
101+ {
102+ void ConfigureServices ( IServiceCollection services ) { }
103+ void Configure ( IApplicationBuilder app )
104+ {
105+ app . Run ( context => context . Response . WriteAsync ( "UseStartupFactoryWorks" ) ) ;
106+ }
107+
108+ var server = new TestServer ( ) ;
109+ var host = builder . UseServer ( server )
110+ . UseStartup ( context => new DelegatingStartup ( ConfigureServices , Configure ) )
111+ . Build ( ) ;
112+ using ( host )
113+ {
114+ await host . StartAsync ( ) ;
115+ await AssertResponseContains ( server . RequestDelegate , "UseStartupFactoryWorks" ) ;
116+ }
117+ }
118+
71119 [ Theory ]
72120 [ MemberData ( nameof ( DefaultWebHostBuildersWithConfig ) ) ]
73121 public async Task StartupCtorThrows_Fallback ( IWebHostBuilder builder )
@@ -199,7 +247,7 @@ public void ConfigureDefaultServiceProviderWithContext(IWebHostBuilder builder)
199247 options . ValidateScopes = true ;
200248 } ) ;
201249
202- using var host = hostBuilder . Build ( ) ;
250+ using var host = hostBuilder . Build ( ) ;
203251 Assert . Throws < InvalidOperationException > ( ( ) => host . Start ( ) ) ;
204252 Assert . True ( configurationCallbackCalled ) ;
205253 }
@@ -1218,7 +1266,7 @@ public void UseConfigurationWithSectionAddsSubKeys(IWebHostBuilder builder)
12181266
12191267 Assert . Equal ( "nestedvalue" , builder . GetSetting ( "key" ) ) ;
12201268
1221- using var host = builder . Build ( ) ;
1269+ using var host = builder . Build ( ) ;
12221270 var appConfig = host . Services . GetRequiredService < IConfiguration > ( ) ;
12231271 Assert . Equal ( "nestedvalue" , appConfig [ "key" ] ) ;
12241272 }
@@ -1574,6 +1622,21 @@ public void Configure(IWebHostBuilder builder)
15741622 }
15751623 }
15761624
1625+ public class DelegatingStartup
1626+ {
1627+ private readonly Action < IServiceCollection > _configureServices ;
1628+ private readonly Action < IApplicationBuilder > _configure ;
1629+
1630+ public DelegatingStartup ( Action < IServiceCollection > configureServices , Action < IApplicationBuilder > configure )
1631+ {
1632+ _configureServices = configureServices ;
1633+ _configure = configure ;
1634+ }
1635+
1636+ public void ConfigureServices ( IServiceCollection services ) => _configureServices ( services ) ;
1637+ public void Configure ( IApplicationBuilder app ) => _configure ( app ) ;
1638+ }
1639+
15771640 public class StartupWithResolvedDisposableThatThrows
15781641 {
15791642 public StartupWithResolvedDisposableThatThrows ( DisposableService service )
0 commit comments