From 44d5bf074fd72886f2a6880b8cf27ff8826399cf Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 25 Jan 2018 13:51:54 -0800 Subject: [PATCH] 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. --- .../MiddlewareFactory.cs | 2 +- .../UseMiddlewareTest.cs | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs b/src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs index 5e5cd285f4..49f120160c 100644 --- a/src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs +++ b/src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs @@ -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) diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs index 342aa54a06..b40e1a3f08 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs @@ -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(context.Items["before"])); + Assert.True(Assert.IsType(context.Items["after"])); + } + public class Middleware : IMiddleware { public async Task InvokeAsync(HttpContext context, RequestDelegate next)