// 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.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Web.Http.Metadata; namespace System.Web.Http.Validation { /// /// Defines a cache for s. This cache is keyed on the type or property that the metadata is associated with. /// internal class ModelValidatorCache : IModelValidatorCache { private ConcurrentDictionary, ModelValidator[]> _validatorCache = new ConcurrentDictionary, ModelValidator[]>(); private Lazy> _validatorProviders; public ModelValidatorCache(Lazy> validatorProviders) { _validatorProviders = validatorProviders; } public ModelValidator[] GetValidators(ModelMetadata metadata) { ModelValidator[] validators; if (!_validatorCache.TryGetValue(metadata.CacheKey, out validators)) { // Compute validators // There are no side-effects if the same validators are created more than once validators = metadata.GetValidators(_validatorProviders.Value).ToArray(); _validatorCache.TryAdd(metadata.CacheKey, validators); } return validators; } } }