diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Builder/MvcApplicationBuilderExtensions.cs b/src/Microsoft.AspNetCore.Mvc.Core/Builder/MvcApplicationBuilderExtensions.cs index c35d40d0f1..74e5f8e5ec 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/Builder/MvcApplicationBuilderExtensions.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/Builder/MvcApplicationBuilderExtensions.cs @@ -79,9 +79,6 @@ namespace Microsoft.AspNetCore.Builder VerifyMvcIsRegistered(app); - var middlewarePipelineBuilder = app.ApplicationServices.GetRequiredService(); - middlewarePipelineBuilder.ApplicationBuilder = app.New(); - var routes = new RouteBuilder(app) { DefaultHandler = app.ApplicationServices.GetRequiredService(), diff --git a/src/Microsoft.AspNetCore.Mvc.Core/DependencyInjection/MvcCoreServiceCollectionExtensions.cs b/src/Microsoft.AspNetCore.Mvc.Core/DependencyInjection/MvcCoreServiceCollectionExtensions.cs index 84b77646bc..2f48bbedb0 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/DependencyInjection/MvcCoreServiceCollectionExtensions.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/DependencyInjection/MvcCoreServiceCollectionExtensions.cs @@ -273,6 +273,8 @@ namespace Microsoft.Extensions.DependencyInjection services.TryAddSingleton(); // This maintains a cache of middleware pipelines, so it needs to be a singleton services.TryAddSingleton(); + // Sets ApplicationBuilder on MiddlewareFilterBuilder + services.TryAddEnumerable(ServiceDescriptor.Singleton()); } private static void ConfigureDefaultServices(IServiceCollection services) diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Internal/MiddlewareFilterBuilderStartupFilter.cs b/src/Microsoft.AspNetCore.Mvc.Core/Internal/MiddlewareFilterBuilderStartupFilter.cs new file mode 100644 index 0000000000..d568da7b51 --- /dev/null +++ b/src/Microsoft.AspNetCore.Mvc.Core/Internal/MiddlewareFilterBuilderStartupFilter.cs @@ -0,0 +1,26 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNetCore.Mvc.Internal +{ + internal class MiddlewareFilterBuilderStartupFilter : IStartupFilter + { + public Action Configure(Action next) + { + return MiddlewareFilterBuilder; + + void MiddlewareFilterBuilder(IApplicationBuilder builder) + { + var middlewarePipelineBuilder = builder.ApplicationServices.GetRequiredService(); + middlewarePipelineBuilder.ApplicationBuilder = builder.New(); + + next(builder); + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/DependencyInjection/MvcCoreServiceCollectionExtensionsTest.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/DependencyInjection/MvcCoreServiceCollectionExtensionsTest.cs index e2e7412818..3e6c558518 100644 --- a/test/Microsoft.AspNetCore.Mvc.Core.Test/DependencyInjection/MvcCoreServiceCollectionExtensionsTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/DependencyInjection/MvcCoreServiceCollectionExtensionsTest.cs @@ -38,7 +38,7 @@ namespace Microsoft.AspNetCore.Mvc var services = new ServiceCollection(); // Register a mock implementation of each service, AddMvcServices should add another implementation. - foreach (var serviceType in MutliRegistrationServiceTypes) + foreach (var serviceType in MultiRegistrationServiceTypes) { var mockType = typeof(Mock<>).MakeGenericType(serviceType.Key); services.Add(ServiceDescriptor.Transient(serviceType.Key, mockType)); @@ -48,7 +48,7 @@ namespace Microsoft.AspNetCore.Mvc MvcCoreServiceCollectionExtensions.AddMvcCoreServices(services); // Assert - foreach (var serviceType in MutliRegistrationServiceTypes) + foreach (var serviceType in MultiRegistrationServiceTypes) { AssertServiceCountEquals(services, serviceType.Key, serviceType.Value.Length + 1); @@ -222,14 +222,14 @@ namespace Microsoft.AspNetCore.Mvc var services = new ServiceCollection(); MvcCoreServiceCollectionExtensions.AddMvcCoreServices(services); - var multiRegistrationServiceTypes = MutliRegistrationServiceTypes; + var multiRegistrationServiceTypes = MultiRegistrationServiceTypes; return services .Where(sd => !multiRegistrationServiceTypes.Keys.Contains(sd.ServiceType)) .Select(sd => sd.ServiceType); } } - private Dictionary MutliRegistrationServiceTypes + private Dictionary MultiRegistrationServiceTypes { get { @@ -313,6 +313,13 @@ namespace Microsoft.AspNetCore.Mvc typeof(MvcEndpointDataSource), } }, + { + typeof(IStartupFilter), + new Type[] + { + typeof(MiddlewareFilterBuilderStartupFilter) + } + }, }; } }