// 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;
}
}
}