Configure IStartupFilters in FIFO order #653

This commit is contained in:
John Luo 2016-03-17 14:36:15 -07:00
parent 32740d67a7
commit ac7741fe81
3 changed files with 49 additions and 2 deletions

View File

@ -162,7 +162,7 @@ namespace Microsoft.AspNetCore.Hosting.Internal
var startupFilters = _applicationServices.GetService<IEnumerable<IStartupFilter>>();
var configure = Startup.ConfigureDelegate;
foreach (var filter in startupFilters)
foreach (var filter in startupFilters.Reverse())
{
configure = filter.Configure(configure);
}

View File

@ -250,6 +250,53 @@ namespace Microsoft.AspNetCore.Hosting
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]
public void EnvDefaultsToProductionIfNoConfig()
{

View File

@ -275,7 +275,7 @@ namespace Microsoft.AspNetCore.TestHost
{
app.Run(context =>
{
Assert.NotNull(context.RequestServices);
Assert.Null(context.RequestServices);
return context.Response.WriteAsync("Success");
});
})