diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionExecutor.cs b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionExecutor.cs deleted file mode 100644 index fba1fa2365..0000000000 --- a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionExecutor.cs +++ /dev/null @@ -1,43 +0,0 @@ -// 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 System.Collections.Generic; -using System.ComponentModel; -using System.Reflection; -using System.Threading.Tasks; -using Microsoft.Extensions.Internal; - -namespace Microsoft.AspNetCore.Mvc.Internal -{ - public static class ControllerActionExecutor - { - public static object[] PrepareArguments( - IDictionary actionParameters, - ObjectMethodExecutor actionMethodExecutor) - { - var declaredParameterInfos = actionMethodExecutor.MethodParameters; - var count = declaredParameterInfos.Length; - if (count == 0) - { - return null; - } - - var arguments = new object[count]; - for (var index = 0; index < count; index++) - { - var parameterInfo = declaredParameterInfos[index]; - object value; - - if (!actionParameters.TryGetValue(parameterInfo.Name, out value)) - { - value = actionMethodExecutor.GetDefaultValueForParameter(index); - } - - arguments[index] = value; - } - - return arguments; - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionInvoker.cs b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionInvoker.cs index ea9e76bb98..4a10775919 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionInvoker.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionInvoker.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Diagnostics; -using System.Reflection; using System.Runtime.ExceptionServices; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.Abstractions; @@ -38,7 +37,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal private ResultExecutingContext _resultExecutingContext; private ResultExecutedContext _resultExecutedContext; - public ControllerActionInvoker( + internal ControllerActionInvoker( IControllerFactory controllerFactory, ParameterBinder parameterBinder, IModelMetadataProvider modelMetadataProvider, @@ -761,7 +760,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal var executor = _executor; var controller = _controller; var arguments = _arguments; - var orderedArguments = ControllerActionExecutor.PrepareArguments(arguments, executor); + var orderedArguments = PrepareArguments(arguments, executor); var diagnosticSource = _diagnosticSource; var logger = _logger; @@ -1064,6 +1063,34 @@ namespace Microsoft.AspNetCore.Mvc.Internal } } + private static object[] PrepareArguments( + IDictionary actionParameters, + ObjectMethodExecutor actionMethodExecutor) + { + var declaredParameterInfos = actionMethodExecutor.MethodParameters; + var count = declaredParameterInfos.Length; + if (count == 0) + { + return null; + } + + var arguments = new object[count]; + for (var index = 0; index < count; index++) + { + var parameterInfo = declaredParameterInfos[index]; + + if (!actionParameters.TryGetValue(parameterInfo.Name, out var value)) + { + value = actionMethodExecutor.GetDefaultValueForParameter(index); + } + + arguments[index] = value; + } + + return arguments; + } + + private enum Scope { Resource, diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionInvokerCache.cs b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionInvokerCache.cs index defa5d223e..2df496ad83 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionInvokerCache.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionInvokerCache.cs @@ -103,7 +103,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal public struct ControllerActionInvokerState { - public ControllerActionInvokerState( + internal ControllerActionInvokerState( IFilterMetadata[] filters, ObjectMethodExecutor actionMethodExecutor) { @@ -113,7 +113,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal public IFilterMetadata[] Filters { get; } - public ObjectMethodExecutor ActionMethodExecutor { get; set; } + internal ObjectMethodExecutor ActionMethodExecutor { get; } } } } diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionInvokerProvider.cs b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionInvokerProvider.cs index 07a91505d5..2466dd6413 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionInvokerProvider.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerActionInvokerProvider.cs @@ -67,7 +67,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal var cacheState = _controllerActionInvokerCache.GetState(controllerContext); - context.Result = new ControllerActionInvoker( + var invoker = new ControllerActionInvoker( _controllerFactory, _parameterBinder, _modelMetadataProvider, @@ -76,6 +76,8 @@ namespace Microsoft.AspNetCore.Mvc.Internal controllerContext, cacheState.Filters, cacheState.ActionMethodExecutor); + + context.Result = invoker; } } diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Microsoft.AspNetCore.Mvc.Core.csproj b/src/Microsoft.AspNetCore.Mvc.Core/Microsoft.AspNetCore.Mvc.Core.csproj index 5d7ad0aebd..5acd398017 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/Microsoft.AspNetCore.Mvc.Core.csproj +++ b/src/Microsoft.AspNetCore.Mvc.Core/Microsoft.AspNetCore.Mvc.Core.csproj @@ -32,7 +32,7 @@ Microsoft.AspNetCore.Mvc.RouteAttribute - + diff --git a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Microsoft.AspNetCore.Mvc.ViewFeatures.csproj b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Microsoft.AspNetCore.Mvc.ViewFeatures.csproj index 64d45d025d..580a35bf93 100644 --- a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Microsoft.AspNetCore.Mvc.ViewFeatures.csproj +++ b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Microsoft.AspNetCore.Mvc.ViewFeatures.csproj @@ -26,6 +26,7 @@ Microsoft.AspNetCore.Mvc.ViewComponent + diff --git a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponents/DefaultViewComponentInvoker.cs b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponents/DefaultViewComponentInvoker.cs index d8a0d866ec..78624b20e4 100644 --- a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponents/DefaultViewComponentInvoker.cs +++ b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponents/DefaultViewComponentInvoker.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.ExceptionServices; @@ -102,7 +103,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewComponents using (_logger.ViewComponentScope(context)) { - var arguments = ControllerActionExecutor.PrepareArguments(context.Arguments, executor); + var arguments = PrepareArguments(context.Arguments, executor); _diagnosticSource.BeforeViewComponent(context, component); _logger.ViewComponentExecuting(context, arguments); @@ -145,9 +146,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewComponents using (_logger.ViewComponentScope(context)) { - var arguments = ControllerActionExecutor.PrepareArguments( - context.Arguments, - executor); + var arguments = PrepareArguments(context.Arguments, executor); _diagnosticSource.BeforeViewComponent(context, component); _logger.ViewComponentExecuting(context, arguments); @@ -204,5 +203,32 @@ namespace Microsoft.AspNetCore.Mvc.ViewComponents typeof(IHtmlContent).Name, typeof(IViewComponentResult).Name)); } + + private static object[] PrepareArguments( + IDictionary parameters, + ObjectMethodExecutor objectMethodExecutor) + { + var declaredParameterInfos = objectMethodExecutor.MethodParameters; + var count = declaredParameterInfos.Length; + if (count == 0) + { + return null; + } + + var arguments = new object[count]; + for (var index = 0; index < count; index++) + { + var parameterInfo = declaredParameterInfos[index]; + + if (!parameters.TryGetValue(parameterInfo.Name, out var value)) + { + value = objectMethodExecutor.GetDefaultValueForParameter(index); + } + + arguments[index] = value; + } + + return arguments; + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponents/ViewComponentInvokerCache.cs b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponents/ViewComponentInvokerCache.cs index 701dfc8a0c..e19a2673c5 100644 --- a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponents/ViewComponentInvokerCache.cs +++ b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponents/ViewComponentInvokerCache.cs @@ -37,7 +37,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal } } - public ObjectMethodExecutor GetViewComponentMethodExecutor(ViewComponentContext viewComponentContext) + internal ObjectMethodExecutor GetViewComponentMethodExecutor(ViewComponentContext viewComponentContext) { var cache = CurrentCache; var viewComponentDescriptor = viewComponentContext.ViewComponentDescriptor;