using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.Mvc.ModelBinding; namespace Microsoft.AspNet.Mvc { public class DefaultActionBindingContextProvider : IActionBindingContextProvider { private readonly IModelMetadataProvider _modelMetadataProvider; private readonly IEnumerable _modelBinders; private readonly IEnumerable _valueProviderFactories; private readonly IInputFormatterProvider _inputFormatterProvider; private readonly IEnumerable _validatorProviders; public DefaultActionBindingContextProvider(IModelMetadataProvider modelMetadataProvider, IEnumerable modelBinders, IEnumerable valueProviderFactories, IInputFormatterProvider inputFormatterProvider, IEnumerable validatorProviders) { _modelMetadataProvider = modelMetadataProvider; _modelBinders = modelBinders.OrderBy(binder => binder.GetType() == typeof(ComplexModelDtoModelBinder) ? 1 : 0); _valueProviderFactories = valueProviderFactories; _inputFormatterProvider = inputFormatterProvider; _validatorProviders = validatorProviders; } public async Task GetActionBindingContextAsync(ActionContext actionContext) { var requestContext = new RequestContext(actionContext.HttpContext, actionContext.RouteValues); var valueProviders = await Task.WhenAll(_valueProviderFactories.Select(factory => factory.GetValueProviderAsync(requestContext))); valueProviders = valueProviders.Where(vp => vp != null) .ToArray(); return new ActionBindingContext( actionContext, _modelMetadataProvider, new CompositeModelBinder(_modelBinders), new CompositeValueProvider(valueProviders), _inputFormatterProvider, _validatorProviders ); } } }