// 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.Mvc.ModelBinding; namespace Microsoft.AspNet.Mvc { public class DefaultActionBindingContextProvider : IActionBindingContextProvider { private readonly IModelMetadataProvider _modelMetadataProvider; private readonly ICompositeModelBinder _compositeModelBinder; private readonly IValueProviderFactory _compositeValueProviderFactory; private readonly IInputFormatterProvider _inputFormatterProvider; private readonly IEnumerable _validatorProviders; private Tuple _bindingContext; public DefaultActionBindingContextProvider(IModelMetadataProvider modelMetadataProvider, ICompositeModelBinder compositeModelBinder, ICompositeValueProviderFactory compositeValueProviderFactory, IInputFormatterProvider inputFormatterProvider, IEnumerable validatorProviders) { _modelMetadataProvider = modelMetadataProvider; _compositeModelBinder = compositeModelBinder; _compositeValueProviderFactory = compositeValueProviderFactory; _inputFormatterProvider = inputFormatterProvider; _validatorProviders = validatorProviders; } public Task GetActionBindingContextAsync(ActionContext actionContext) { if (_bindingContext != null) { if (actionContext == _bindingContext.Item1) { return Task.FromResult(_bindingContext.Item2); } } var factoryContext = new ValueProviderFactoryContext( actionContext.HttpContext, actionContext.RouteData.Values); var valueProvider = _compositeValueProviderFactory.GetValueProvider(factoryContext); var context = new ActionBindingContext( actionContext, _modelMetadataProvider, _compositeModelBinder, valueProvider, _inputFormatterProvider, _validatorProviders); _bindingContext = new Tuple(actionContext, context); return Task.FromResult(context); } } }