/// <summary>
        /// Initializes a new instance of the <see cref="CachedPropertyValueFactory"/> class.
        /// </summary>
        /// <param name="propertyValueFactory">Real factory.</param>
        /// <param name="propertyComparer">Property comparer.</param>
        /// <param name="maxItemCount">Max item count in cache.</param>
        public CachedPropertyValueFactory(
            IPropertyValueFactory propertyValueFactory,
            IEqualityComparer <IProperty> propertyComparer,
            int?maxItemCount = null)
        {
            propertyValueFactory.AssertArgumentNotNull(nameof(propertyValueFactory));
            propertyComparer.AssertArgumentNotNull(nameof(propertyComparer));

            _propertyValueFactory = propertyValueFactory;

            var propertyValueKeyComparer = new PropertyValueKeyComparer(propertyComparer);

            if (maxItemCount == null)
            {
                // unlimited cache
                _propertyValuesCache = new ConcurrentDictionaryAdapter <PropertyValueInfo, IPropertyValue>(new ConcurrentDictionary <PropertyValueInfo, IPropertyValue>(propertyValueKeyComparer));
            }
            else
            {
                // limited cache
                _propertyValuesCache = new Core.TwoLayerCache <PropertyValueInfo, IPropertyValue>(maxItemCount.Value, propertyValueKeyComparer);
            }
        }
            public PropertyValueKeyComparer(IEqualityComparer <IProperty> propertyComparer)
            {
                propertyComparer.AssertArgumentNotNull(nameof(propertyComparer));

                _propertyComparer = propertyComparer;
            }