Enabling basic input formatter selection.

Conflicts:
	Mvc.sln
	src/Microsoft.AspNet.Mvc.Core/Formatters/TempInputFormatterProvider.cs
	src/Microsoft.AspNet.Mvc.Core/Microsoft.AspNet.Mvc.Core.kproj
	src/Microsoft.AspNet.Mvc.Core/ReflectedActionInvoker.cs
	src/Microsoft.AspNet.Mvc.Core/ReflectedActionInvokerProvider.cs
	src/Microsoft.AspNet.Mvc/MvcServices.cs
	test/Microsoft.AspNet.Mvc.Core.Test/Microsoft.AspNet.Mvc.Core.Test.kproj
	test/Microsoft.AspNet.Mvc.Core.Test/ReflectedActionInvokerTest.cs

Conflicts:
	src/Microsoft.AspNet.Mvc.Core/Formatters/TempInputFormatterProvider.cs
This commit is contained in:
harshgMSFT 2014-08-13 13:56:51 -07:00
parent 764b1e64b8
commit 6f0fa67170
15 changed files with 141 additions and 82 deletions

View File

@ -1,6 +1,7 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // 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.Collections.Generic;
using Microsoft.AspNet.Http; using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc.ModelBinding; using Microsoft.AspNet.Mvc.ModelBinding;
@ -39,6 +40,12 @@ namespace Microsoft.AspNet.Mvc
public ModelStateDictionary ModelState { get; private set; } public ModelStateDictionary ModelState { get; private set; }
public ActionDescriptor ActionDescriptor { get; private set; } public ActionDescriptor ActionDescriptor { get; private set; }
/// <summary>
/// Input formatters associated with this context.
/// The formatters are populated only after IInputFormattersProvider runs.
/// </summary>
public IList<IInputFormatter> InputFormatters { get; set; }
/// <summary> /// <summary>
/// The controller is available only after the controller factory runs. /// The controller is available only after the controller factory runs.

View File

@ -240,16 +240,10 @@ namespace Microsoft.AspNet.Mvc
var modelMetadata = metadataProvider.GetMetadataForType( var modelMetadata = metadataProvider.GetMetadataForType(
modelAccessor: null, modelAccessor: null,
modelType: parameterType); modelType: parameterType);
var providerContext = new InputFormatterProviderContext(
actionBindingContext.ActionContext,
modelMetadata,
modelState);
var inputFormatter = actionBindingContext.InputFormatterProvider.GetInputFormatter(
providerContext);
var formatterContext = new InputFormatterContext(actionBindingContext.ActionContext, var formatterContext = new InputFormatterContext(actionBindingContext.ActionContext,
modelMetadata.ModelType); modelMetadata.ModelType);
var inputFormatter = actionBindingContext.InputFormatterSelector.SelectFormatter(
formatterContext);
parameterValues[parameter.Name] = await inputFormatter.ReadAsync(formatterContext); parameterValues[parameter.Name] = await inputFormatter.ReadAsync(formatterContext);
} }
else else

View File

@ -6,32 +6,22 @@ using System.Globalization;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
{ {
public class TempInputFormatterProvider : IInputFormatterProvider public class DefaultInputFormatterSelector : IInputFormatterSelector
{ {
private IInputFormattersProvider _defaultFormattersProvider; public IInputFormatter SelectFormatter(InputFormatterContext context)
public TempInputFormatterProvider([NotNull] IInputFormattersProvider formattersProvider)
{ {
_defaultFormattersProvider = formattersProvider;
}
public IInputFormatter GetInputFormatter(InputFormatterProviderContext context)
{
var request = context.ActionContext.HttpContext.Request;
var formatterContext = new InputFormatterContext(context.ActionContext,
context.Metadata.ModelType);
// TODO: https://github.com/aspnet/Mvc/issues/1014 // TODO: https://github.com/aspnet/Mvc/issues/1014
var formatters = _defaultFormattersProvider.InputFormatters; var formatters = context.ActionContext.InputFormatters;
foreach (var formatter in formatters) foreach (var formatter in formatters)
{ {
var formatterMatched = formatter.CanRead(formatterContext); if (formatter.CanRead(context))
if (formatterMatched)
{ {
return formatter; return formatter;
} }
} }
var request = context.ActionContext.HttpContext.Request;
// TODO: https://github.com/aspnet/Mvc/issues/458 // TODO: https://github.com/aspnet/Mvc/issues/458
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
"415: Unsupported content type {0}", "415: Unsupported content type {0}",

View File

@ -9,8 +9,8 @@ using System.Threading.Tasks;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
{ {
public interface IInputFormatterProvider public interface IInputFormatterSelector
{ {
IInputFormatter GetInputFormatter(InputFormatterProviderContext context); IInputFormatter SelectFormatter(InputFormatterContext context);
} }
} }

View File

@ -1,26 +0,0 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc.ModelBinding;
namespace Microsoft.AspNet.Mvc
{
public class InputFormatterProviderContext
{
public InputFormatterProviderContext([NotNull] ActionContext actionContext,
[NotNull] ModelMetadata metadata,
[NotNull] ModelStateDictionary modelState)
{
ActionContext = actionContext;
Metadata = metadata;
ModelState = modelState;
}
public ActionContext ActionContext { get; private set; }
public ModelMetadata Metadata { get; private set; }
public ModelStateDictionary ModelState { get; private set; }
}
}

View File

@ -59,7 +59,7 @@ namespace Microsoft.AspNet.Mvc
/// <summary> /// <summary>
/// Get a list of the <see cref="InputFormatterDescriptor" /> which are used to construct /// Get a list of the <see cref="InputFormatterDescriptor" /> which are used to construct
/// a list of <see cref="IInputFormatter"/> by <see cref="IInputFormatterProvider"/>. /// a list of <see cref="IInputFormatter"/> by <see cref="IInputFormattersProvider"/>.
/// </summary> /// </summary>
public List<InputFormatterDescriptor> InputFormatters { get; private set; } public List<InputFormatterDescriptor> InputFormatters { get; private set; }

View File

@ -12,14 +12,14 @@ namespace Microsoft.AspNet.Mvc
IModelMetadataProvider metadataProvider, IModelMetadataProvider metadataProvider,
IModelBinder modelBinder, IModelBinder modelBinder,
IValueProvider valueProvider, IValueProvider valueProvider,
IInputFormatterProvider inputFormatterProvider, IInputFormatterSelector inputFormatterSelector,
IEnumerable<IModelValidatorProvider> validatorProviders) IEnumerable<IModelValidatorProvider> validatorProviders)
{ {
ActionContext = context; ActionContext = context;
MetadataProvider = metadataProvider; MetadataProvider = metadataProvider;
ModelBinder = modelBinder; ModelBinder = modelBinder;
ValueProvider = valueProvider; ValueProvider = valueProvider;
InputFormatterProvider = inputFormatterProvider; InputFormatterSelector = inputFormatterSelector;
ValidatorProviders = validatorProviders; ValidatorProviders = validatorProviders;
} }
@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Mvc
public IValueProvider ValueProvider { get; private set; } public IValueProvider ValueProvider { get; private set; }
public IInputFormatterProvider InputFormatterProvider { get; private set; } public IInputFormatterSelector InputFormatterSelector { get; private set; }
public IEnumerable<IModelValidatorProvider> ValidatorProviders { get; private set; } public IEnumerable<IModelValidatorProvider> ValidatorProviders { get; private set; }
} }

View File

@ -13,20 +13,20 @@ namespace Microsoft.AspNet.Mvc
private readonly IModelMetadataProvider _modelMetadataProvider; private readonly IModelMetadataProvider _modelMetadataProvider;
private readonly ICompositeModelBinder _compositeModelBinder; private readonly ICompositeModelBinder _compositeModelBinder;
private readonly IValueProviderFactory _compositeValueProviderFactory; private readonly IValueProviderFactory _compositeValueProviderFactory;
private readonly IInputFormatterProvider _inputFormatterProvider; private readonly IInputFormatterSelector _inputFormatterSelector;
private readonly IEnumerable<IModelValidatorProvider> _validatorProviders; private readonly IEnumerable<IModelValidatorProvider> _validatorProviders;
private Tuple<ActionContext, ActionBindingContext> _bindingContext; private Tuple<ActionContext, ActionBindingContext> _bindingContext;
public DefaultActionBindingContextProvider(IModelMetadataProvider modelMetadataProvider, public DefaultActionBindingContextProvider(IModelMetadataProvider modelMetadataProvider,
ICompositeModelBinder compositeModelBinder, ICompositeModelBinder compositeModelBinder,
ICompositeValueProviderFactory compositeValueProviderFactory, ICompositeValueProviderFactory compositeValueProviderFactory,
IInputFormatterProvider inputFormatterProvider, IInputFormatterSelector inputFormatterProvider,
IEnumerable<IModelValidatorProvider> validatorProviders) IEnumerable<IModelValidatorProvider> validatorProviders)
{ {
_modelMetadataProvider = modelMetadataProvider; _modelMetadataProvider = modelMetadataProvider;
_compositeModelBinder = compositeModelBinder; _compositeModelBinder = compositeModelBinder;
_compositeValueProviderFactory = compositeValueProviderFactory; _compositeValueProviderFactory = compositeValueProviderFactory;
_inputFormatterProvider = inputFormatterProvider; _inputFormatterSelector = inputFormatterProvider;
_validatorProviders = validatorProviders; _validatorProviders = validatorProviders;
} }
@ -51,7 +51,7 @@ namespace Microsoft.AspNet.Mvc
_modelMetadataProvider, _modelMetadataProvider,
_compositeModelBinder, _compositeModelBinder,
valueProvider, valueProvider,
_inputFormatterProvider, _inputFormatterSelector,
_validatorProviders); _validatorProviders);
_bindingContext = new Tuple<ActionContext, ActionBindingContext>(actionContext, context); _bindingContext = new Tuple<ActionContext, ActionBindingContext>(actionContext, context);

View File

@ -2,6 +2,9 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.Mvc.Core; using Microsoft.AspNet.Mvc.Core;
using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection;
@ -12,16 +15,19 @@ namespace Microsoft.AspNet.Mvc
{ {
private readonly ReflectedActionDescriptor _descriptor; private readonly ReflectedActionDescriptor _descriptor;
private readonly IControllerFactory _controllerFactory; private readonly IControllerFactory _controllerFactory;
private readonly IInputFormattersProvider _inputFormattersProvider;
public ReflectedActionInvoker([NotNull] ActionContext actionContext, public ReflectedActionInvoker([NotNull] ActionContext actionContext,
[NotNull] IActionBindingContextProvider bindingContextProvider, [NotNull] IActionBindingContextProvider bindingContextProvider,
[NotNull] INestedProviderManager<FilterProviderContext> filterProvider, [NotNull] INestedProviderManager<FilterProviderContext> filterProvider,
[NotNull] IControllerFactory controllerFactory, [NotNull] IControllerFactory controllerFactory,
[NotNull] ReflectedActionDescriptor descriptor) [NotNull] ReflectedActionDescriptor descriptor,
[NotNull] IInputFormattersProvider inputFormattersProvider)
: base(actionContext, bindingContextProvider, filterProvider) : base(actionContext, bindingContextProvider, filterProvider)
{ {
_descriptor = descriptor; _descriptor = descriptor;
_controllerFactory = controllerFactory; _controllerFactory = controllerFactory;
_inputFormattersProvider = inputFormattersProvider;
if (descriptor.MethodInfo == null) if (descriptor.MethodInfo == null)
{ {
throw new ArgumentException( throw new ArgumentException(
@ -34,9 +40,11 @@ namespace Microsoft.AspNet.Mvc
public override Task InvokeAsync() public override Task InvokeAsync()
{ {
ActionContext.Controller = _controllerFactory.CreateController(ActionContext); ActionContext.Controller = _controllerFactory.CreateController(ActionContext);
ActionContext.InputFormatters = _inputFormattersProvider.InputFormatters
.ToList();
return base.InvokeAsync(); return base.InvokeAsync();
} }
protected override async Task<IActionResult> InvokeActionAsync(ActionExecutingContext actionExecutingContext) protected override async Task<IActionResult> InvokeActionAsync(ActionExecutingContext actionExecutingContext)
{ {
var actionMethodInfo = _descriptor.MethodInfo; var actionMethodInfo = _descriptor.MethodInfo;
@ -81,4 +89,4 @@ namespace Microsoft.AspNet.Mvc
}; };
} }
} }
} }

View File

@ -10,14 +10,17 @@ namespace Microsoft.AspNet.Mvc
{ {
private readonly IControllerFactory _controllerFactory; private readonly IControllerFactory _controllerFactory;
private readonly IActionBindingContextProvider _bindingProvider; private readonly IActionBindingContextProvider _bindingProvider;
private readonly IInputFormattersProvider _inputFormattersProvider;
private readonly INestedProviderManager<FilterProviderContext> _filterProvider; private readonly INestedProviderManager<FilterProviderContext> _filterProvider;
public ReflectedActionInvokerProvider(IControllerFactory controllerFactory, public ReflectedActionInvokerProvider(IControllerFactory controllerFactory,
IActionBindingContextProvider bindingProvider, IActionBindingContextProvider bindingProvider,
IInputFormattersProvider inputFormattersProvider,
INestedProviderManager<FilterProviderContext> filterProvider) INestedProviderManager<FilterProviderContext> filterProvider)
{ {
_controllerFactory = controllerFactory; _controllerFactory = controllerFactory;
_bindingProvider = bindingProvider; _bindingProvider = bindingProvider;
_inputFormattersProvider = inputFormattersProvider;
_filterProvider = filterProvider; _filterProvider = filterProvider;
} }
@ -37,7 +40,8 @@ namespace Microsoft.AspNet.Mvc
_bindingProvider, _bindingProvider,
_filterProvider, _filterProvider,
_controllerFactory, _controllerFactory,
actionDescriptor); actionDescriptor,
_inputFormattersProvider);
} }
callNext(); callNext();

View File

@ -64,8 +64,8 @@ namespace Microsoft.AspNet.Mvc
yield return describe.Transient<IModelMetadataProvider, DataAnnotationsModelMetadataProvider>(); yield return describe.Transient<IModelMetadataProvider, DataAnnotationsModelMetadataProvider>();
yield return describe.Scoped<IActionBindingContextProvider, DefaultActionBindingContextProvider>(); yield return describe.Scoped<IActionBindingContextProvider, DefaultActionBindingContextProvider>();
yield return describe.Transient<IInputFormatterProvider, TempInputFormatterProvider>(); yield return describe.Transient<IInputFormatterSelector, DefaultInputFormatterSelector>();
yield return describe.Transient<IInputFormattersProvider, DefaultInputFormattersProvider>(); yield return describe.Scoped<IInputFormattersProvider, DefaultInputFormattersProvider>();
yield return describe.Transient<IModelBinderProvider, DefaultModelBindersProvider>(); yield return describe.Transient<IModelBinderProvider, DefaultModelBindersProvider>();
yield return describe.Scoped<ICompositeModelBinder, CompositeModelBinder>(); yield return describe.Scoped<ICompositeModelBinder, CompositeModelBinder>();

View File

@ -577,7 +577,7 @@ namespace Microsoft.AspNet.Mvc.Test
metadataProvider, metadataProvider,
binder.Object, binder.Object,
valueProvider, valueProvider,
Mock.Of<IInputFormatterProvider>(), Mock.Of<IInputFormatterSelector>(),
Enumerable.Empty<IModelValidatorProvider>()); Enumerable.Empty<IModelValidatorProvider>());
var bindingContextProvider = new Mock<IActionBindingContextProvider>(); var bindingContextProvider = new Mock<IActionBindingContextProvider>();
bindingContextProvider.Setup(b => b.GetActionBindingContextAsync(actionContext)) bindingContextProvider.Setup(b => b.GetActionBindingContextAsync(actionContext))
@ -618,7 +618,7 @@ namespace Microsoft.AspNet.Mvc.Test
metadataProvider, metadataProvider,
binder.Object, binder.Object,
valueProvider, valueProvider,
Mock.Of<IInputFormatterProvider>(), Mock.Of<IInputFormatterSelector>(),
Enumerable.Empty<IModelValidatorProvider>()); Enumerable.Empty<IModelValidatorProvider>());
var bindingContextProvider = new Mock<IActionBindingContextProvider>(); var bindingContextProvider = new Mock<IActionBindingContextProvider>();
bindingContextProvider.Setup(b => b.GetActionBindingContextAsync(actionContext)) bindingContextProvider.Setup(b => b.GetActionBindingContextAsync(actionContext))
@ -659,7 +659,7 @@ namespace Microsoft.AspNet.Mvc.Test
metadataProvider, metadataProvider,
binder.Object, binder.Object,
Mock.Of<IValueProvider>(), Mock.Of<IValueProvider>(),
Mock.Of<IInputFormatterProvider>(), Mock.Of<IInputFormatterSelector>(),
Enumerable.Empty<IModelValidatorProvider>()); Enumerable.Empty<IModelValidatorProvider>());
var bindingContextProvider = new Mock<IActionBindingContextProvider>(); var bindingContextProvider = new Mock<IActionBindingContextProvider>();
bindingContextProvider.Setup(b => b.GetActionBindingContextAsync(actionContext)) bindingContextProvider.Setup(b => b.GetActionBindingContextAsync(actionContext))

View File

@ -0,0 +1,70 @@
// Copyright (c) Microsoft Open Technologies, Inc. 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.Threading.Tasks;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Routing;
using Microsoft.Framework.DependencyInjection;
using Moq;
using Xunit;
namespace Microsoft.AspNet.Mvc.Core.Test
{
public class DefaultInputFormatterSelectorTests
{
[Fact]
public void DefaultInputFormatterSelectorTests_ReturnsFirstFormatterWhichReturnsTrue()
{
// Arrange
var actionContext = GetActionContext();
var context = new InputFormatterContext(actionContext, typeof(int));
actionContext.InputFormatters = new List<IInputFormatter>()
{
new TestInputFormatter(false, 0),
new TestInputFormatter(false, 1),
new TestInputFormatter(true, 2),
new TestInputFormatter(true, 3)
};
var selector = new DefaultInputFormatterSelector();
// Act
var selectedFormatter = selector.SelectFormatter(context);
// Assert
var testFormatter = Assert.IsType<TestInputFormatter>(selectedFormatter);
Assert.Equal(2, testFormatter.Index);
}
private static ActionContext GetActionContext()
{
var httpContext = Mock.Of<HttpContext>();
return new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
}
private class TestInputFormatter : IInputFormatter
{
private bool _canRead = false;
public TestInputFormatter(bool canRead, int index)
{
_canRead = canRead;
Index = index;
}
public int Index { get; set; }
public bool CanRead(InputFormatterContext context)
{
return _canRead;
}
public Task<object> ReadAsync(InputFormatterContext context)
{
return Task.FromResult<object>(Index);
}
}
}
}

View File

@ -1329,13 +1329,16 @@ namespace Microsoft.AspNet.Mvc
.Setup(fp => fp.Invoke(It.IsAny<FilterProviderContext>())) .Setup(fp => fp.Invoke(It.IsAny<FilterProviderContext>()))
.Callback<FilterProviderContext>( .Callback<FilterProviderContext>(
context => context.Results.AddRange(filters.Select(f => new FilterItem(null, f)))); context => context.Results.AddRange(filters.Select(f => new FilterItem(null, f))));
var inputFormattersProvider = new Mock<IInputFormattersProvider>();
inputFormattersProvider.SetupGet(o => o.InputFormatters)
.Returns(new List<IInputFormatter>());
var invoker = new ReflectedActionInvoker( var invoker = new ReflectedActionInvoker(
actionContext, actionContext,
actionBindingContextProvider.Object, actionBindingContextProvider.Object,
filterProvider.Object, filterProvider.Object,
controllerFactory.Object, controllerFactory.Object,
actionDescriptor); actionDescriptor,
inputFormattersProvider.Object);
return invoker; return invoker;
} }
@ -1366,18 +1369,21 @@ namespace Microsoft.AspNet.Mvc
Mock.Of<IModelMetadataProvider>(), Mock.Of<IModelMetadataProvider>(),
binder.Object, binder.Object,
Mock.Of<IValueProvider>(), Mock.Of<IValueProvider>(),
Mock.Of<IInputFormatterProvider>(), Mock.Of<IInputFormatterSelector>(),
Enumerable.Empty<IModelValidatorProvider>()); Enumerable.Empty<IModelValidatorProvider>());
var actionBindingContextProvider = new Mock<IActionBindingContextProvider>(); var actionBindingContextProvider = new Mock<IActionBindingContextProvider>();
actionBindingContextProvider.Setup(p => p.GetActionBindingContextAsync(It.IsAny<ActionContext>())) actionBindingContextProvider.Setup(p => p.GetActionBindingContextAsync(It.IsAny<ActionContext>()))
.Returns(Task.FromResult(bindingContext)); .Returns(Task.FromResult(bindingContext));
var inputFormattersProvider = new Mock<IInputFormattersProvider>();
inputFormattersProvider.SetupGet(o => o.InputFormatters)
.Returns(new List<IInputFormatter>());
var invoker = new ReflectedActionInvoker(actionContext, var invoker = new ReflectedActionInvoker(actionContext,
actionBindingContextProvider.Object, actionBindingContextProvider.Object,
Mock.Of<INestedProviderManager<FilterProviderContext>>(), Mock.Of<INestedProviderManager<FilterProviderContext>>(),
Mock.Of<IControllerFactory>(), Mock.Of<IControllerFactory>(),
actionDescriptor); actionDescriptor,
inputFormattersProvider.Object);
var modelStateDictionary = new ModelStateDictionary(); var modelStateDictionary = new ModelStateDictionary();
@ -1422,18 +1428,21 @@ namespace Microsoft.AspNet.Mvc
Mock.Of<IModelMetadataProvider>(), Mock.Of<IModelMetadataProvider>(),
binder.Object, binder.Object,
Mock.Of<IValueProvider>(), Mock.Of<IValueProvider>(),
Mock.Of<IInputFormatterProvider>(), Mock.Of<IInputFormatterSelector>(),
Enumerable.Empty<IModelValidatorProvider>()); Enumerable.Empty<IModelValidatorProvider>());
var actionBindingContextProvider = new Mock<IActionBindingContextProvider>(); var actionBindingContextProvider = new Mock<IActionBindingContextProvider>();
actionBindingContextProvider.Setup(p => p.GetActionBindingContextAsync(It.IsAny<ActionContext>())) actionBindingContextProvider.Setup(p => p.GetActionBindingContextAsync(It.IsAny<ActionContext>()))
.Returns(Task.FromResult(bindingContext)); .Returns(Task.FromResult(bindingContext));
var inputFormattersProvider = new Mock<IInputFormattersProvider>();
inputFormattersProvider.SetupGet(o => o.InputFormatters)
.Returns(new List<IInputFormatter>());
var invoker = new ReflectedActionInvoker(actionContext, var invoker = new ReflectedActionInvoker(actionContext,
actionBindingContextProvider.Object, actionBindingContextProvider.Object,
Mock.Of<INestedProviderManager<FilterProviderContext>>(), Mock.Of<INestedProviderManager<FilterProviderContext>>(),
Mock.Of<IControllerFactory>(), Mock.Of<IControllerFactory>(),
actionDescriptor); actionDescriptor,
inputFormattersProvider.Object);
var modelStateDictionary = new ModelStateDictionary(); var modelStateDictionary = new ModelStateDictionary();
@ -1479,7 +1488,7 @@ namespace Microsoft.AspNet.Mvc
Mock.Of<IModelMetadataProvider>(), Mock.Of<IModelMetadataProvider>(),
binder.Object, binder.Object,
Mock.Of<IValueProvider>(), Mock.Of<IValueProvider>(),
Mock.Of<IInputFormatterProvider>(), Mock.Of<IInputFormatterSelector>(),
Enumerable.Empty<IModelValidatorProvider>()); Enumerable.Empty<IModelValidatorProvider>());
var actionBindingContextProvider = new Mock<IActionBindingContextProvider>(); var actionBindingContextProvider = new Mock<IActionBindingContextProvider>();
@ -1488,12 +1497,15 @@ namespace Microsoft.AspNet.Mvc
var controllerFactory = new Mock<IControllerFactory>(); var controllerFactory = new Mock<IControllerFactory>();
controllerFactory.Setup(c => c.CreateController(It.IsAny<ActionContext>())) controllerFactory.Setup(c => c.CreateController(It.IsAny<ActionContext>()))
.Returns(new TestController()); .Returns(new TestController());
var inputFormattersProvider = new Mock<IInputFormattersProvider>();
inputFormattersProvider.SetupGet(o => o.InputFormatters)
.Returns(new List<IInputFormatter>());
var invoker = new ReflectedActionInvoker(actionContext, var invoker = new ReflectedActionInvoker(actionContext,
actionBindingContextProvider.Object, actionBindingContextProvider.Object,
Mock.Of<INestedProviderManager<FilterProviderContext>>(), Mock.Of<INestedProviderManager<FilterProviderContext>>(),
controllerFactory.Object, controllerFactory.Object,
actionDescriptor); actionDescriptor,
inputFormattersProvider.Object);
// Act // Act
await invoker.InvokeAsync(); await invoker.InvokeAsync();

View File

@ -92,7 +92,7 @@ namespace Microsoft.AspNet.Mvc.Core
provider, provider,
Mock.Of<IModelBinder>(), Mock.Of<IModelBinder>(),
Mock.Of<IValueProvider>(), Mock.Of<IValueProvider>(),
Mock.Of<IInputFormatterProvider>(), Mock.Of<IInputFormatterSelector>(),
Enumerable.Empty<IModelValidatorProvider>()); Enumerable.Empty<IModelValidatorProvider>());
var urlHelper = Mock.Of<IUrlHelper>(); var urlHelper = Mock.Of<IUrlHelper>();
var actionBindingContextProvider = new Mock<IActionBindingContextProvider>(); var actionBindingContextProvider = new Mock<IActionBindingContextProvider>();