Change MiddlewareFactory to type activate IMiddleware as a fallback (#988)

- This eases the transition and learning when you discover there's
an interface for middleware.
This commit is contained in:
David Fowler 2018-01-25 13:51:54 -08:00 committed by GitHub
parent 2f109938d2
commit 44d5bf074f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 1 deletions

View File

@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Http
public IMiddleware Create(Type middlewareType)
{
return _serviceProvider.GetRequiredService(middlewareType) as IMiddleware;
return ActivatorUtilities.GetServiceOrCreateInstance(_serviceProvider, middlewareType) as IMiddleware;
}
public void Release(IMiddleware middleware)

View File

@ -232,6 +232,23 @@ namespace Microsoft.AspNetCore.Http
Assert.Same(middlewareFactory.Created, middlewareFactory.Released);
}
[Fact]
public async Task UseMiddlewareWithIMiddlewareAndMiddlewareFactoryTypeActivates()
{
var mockServiceProvider = new DummyServiceProvider();
var builder = new ApplicationBuilder(mockServiceProvider);
builder.UseMiddleware(typeof(Middleware));
var app = builder.Build();
var context = new DefaultHttpContext();
var sp = new DummyServiceProvider();
var middlewareFactory = new MiddlewareFactory(sp);
sp.AddService(typeof(IMiddlewareFactory), middlewareFactory);
context.RequestServices = sp;
await app(context);
Assert.True(Assert.IsType<bool>(context.Items["before"]));
Assert.True(Assert.IsType<bool>(context.Items["after"]));
}
public class Middleware : IMiddleware
{
public async Task InvokeAsync(HttpContext context, RequestDelegate next)