Configure IStartupFilters in FIFO order #653
This commit is contained in:
parent
32740d67a7
commit
ac7741fe81
|
|
@ -162,7 +162,7 @@ namespace Microsoft.AspNetCore.Hosting.Internal
|
||||||
|
|
||||||
var startupFilters = _applicationServices.GetService<IEnumerable<IStartupFilter>>();
|
var startupFilters = _applicationServices.GetService<IEnumerable<IStartupFilter>>();
|
||||||
var configure = Startup.ConfigureDelegate;
|
var configure = Startup.ConfigureDelegate;
|
||||||
foreach (var filter in startupFilters)
|
foreach (var filter in startupFilters.Reverse())
|
||||||
{
|
{
|
||||||
configure = filter.Configure(configure);
|
configure = filter.Configure(configure);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -250,6 +250,53 @@ namespace Microsoft.AspNetCore.Hosting
|
||||||
Assert.NotNull(host.Services.GetRequiredService<IOptions<object>>());
|
Assert.NotNull(host.Services.GetRequiredService<IOptions<object>>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ConfiguresStartupFiltersInCorrectOrder()
|
||||||
|
{
|
||||||
|
// Verify ordering
|
||||||
|
var configureOrder = 0;
|
||||||
|
var host = CreateBuilder()
|
||||||
|
.UseServer((IServerFactory)this)
|
||||||
|
.ConfigureServices(services =>
|
||||||
|
{
|
||||||
|
services.AddTransient<IStartupFilter>(serviceProvider => new TestFilter(
|
||||||
|
() => Assert.Equal(1, configureOrder++),
|
||||||
|
() => Assert.Equal(2, configureOrder++),
|
||||||
|
() => Assert.Equal(5, configureOrder++)));
|
||||||
|
services.AddTransient<IStartupFilter>(serviceProvider => new TestFilter(
|
||||||
|
() => Assert.Equal(0, configureOrder++),
|
||||||
|
() => Assert.Equal(3, configureOrder++),
|
||||||
|
() => Assert.Equal(4, configureOrder++)));
|
||||||
|
})
|
||||||
|
.Build();
|
||||||
|
Assert.Equal(6, configureOrder);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class TestFilter : IStartupFilter
|
||||||
|
{
|
||||||
|
private readonly Action _verifyConfigureOrder;
|
||||||
|
private readonly Action _verifyBuildBeforeOrder;
|
||||||
|
private readonly Action _verifyBuildAfterOrder;
|
||||||
|
|
||||||
|
public TestFilter(Action verifyConfigureOrder, Action verifyBuildBeforeOrder, Action verifyBuildAfterOrder)
|
||||||
|
{
|
||||||
|
_verifyConfigureOrder = verifyConfigureOrder;
|
||||||
|
_verifyBuildBeforeOrder = verifyBuildBeforeOrder;
|
||||||
|
_verifyBuildAfterOrder = verifyBuildAfterOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
|
||||||
|
{
|
||||||
|
_verifyConfigureOrder();
|
||||||
|
return builder =>
|
||||||
|
{
|
||||||
|
_verifyBuildBeforeOrder();
|
||||||
|
next(builder);
|
||||||
|
_verifyBuildAfterOrder();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void EnvDefaultsToProductionIfNoConfig()
|
public void EnvDefaultsToProductionIfNoConfig()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -275,7 +275,7 @@ namespace Microsoft.AspNetCore.TestHost
|
||||||
{
|
{
|
||||||
app.Run(context =>
|
app.Run(context =>
|
||||||
{
|
{
|
||||||
Assert.NotNull(context.RequestServices);
|
Assert.Null(context.RequestServices);
|
||||||
return context.Response.WriteAsync("Success");
|
return context.Response.WriteAsync("Success");
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue