/// <summary>Resolves.</summary>
        ///
        /// <typeparam name="T">Generic type parameter.</typeparam>
        /// <param name="compressionType">Type of the compression.</param>
        /// <param name="cacheKey">       The cache key.</param>
        /// <param name="createCacheFn">  The create cache function.</param>
        ///
        /// <returns>An object.</returns>
        public object Resolve <T>(string compressionType, string cacheKey, Func <T> createCacheFn)
            where T : class
        {
            var contentTypeCacheKey = cacheKey + MimeTypes.GetExtension(this.ContentType);

            var acceptsCompress = !string.IsNullOrEmpty(compressionType);
            var cacheKeyZip     = acceptsCompress
                ? contentTypeCacheKey + CompressionTypes.GetExtension(compressionType)
                : null;

            if (acceptsCompress)
            {
                var fromCache = GetCompressedBytesFromCache(compressionType, cacheKeyZip);
                if (fromCache != null)
                {
                    return(fromCache);
                }

                var fromFile = GetCompressedBytesFromFile(compressionType, cacheKeyZip);
                if (fromFile != null)
                {
                    return(fromFile);
                }
            }
            else
            {
                var result = this.CacheClient.Get <string>(cacheKey);
                if (result != null)
                {
                    return(result);
                }

                var fromFile = GetFromFile(contentTypeCacheKey);
                if (fromFile != null)
                {
                    return(fromFile);
                }
            }

            var cacheValueString = this.cacheManager.ResolveText(cacheKey, createCacheFn);

            WriteToFile(contentTypeCacheKey, Encoding.UTF8.GetBytes(cacheValueString));

            if (acceptsCompress)
            {
                var cacheValueZip = cacheValueString.Compress(compressionType);

                this.CacheClient.Set(cacheKeyZip, cacheValueZip);
                WriteToFile(cacheKeyZip, cacheValueZip);

                return(new CompressedResult(cacheValueZip, compressionType, this.ContentType));
            }

            return(cacheValueString);
        }
        public CacheKeyTuple GetCacheKeys <T>(string id)
        {
            var cacheKey = IdUtils.CreateCacheKeyPath <T>(id);

            var contentType     = cacheKey + MimeTypes.GetExtension(MimeTypes.Xml);
            var compressionType = contentType + CompressionTypes.GetExtension(CompressionTypes.Deflate);

            return(new CacheKeyTuple {
                CacheKey = cacheKey,
                ContentTypeCacheKey = contentType,
                CompressionTypeCacheKey = compressionType,
            });
        }
        /// <summary>Clears this object to its blank/initial state.</summary>
        ///
        /// <param name="cacheKeys">A variable-length parameters list containing cache keys.</param>
        public void Clear(params string[] cacheKeys)
        {
            this.cacheManager.Clear(cacheKeys);

            var contentTypeCacheKeys = cacheKeys.ToList().ConvertAll(x => x + MimeTypes.GetExtension(this.ContentType));

            foreach (var cacheKey in contentTypeCacheKeys)
            {
                var filePath        = Path.Combine(this.baseCachePath, cacheKey);
                var gzipFilePath    = Path.Combine(this.baseCachePath, cacheKey + CompressionTypes.GetExtension(CompressionTypes.GZip));
                var deflateFilePath = Path.Combine(this.baseCachePath, cacheKey + CompressionTypes.GetExtension(CompressionTypes.Deflate));

                DeleteFiles(filePath, gzipFilePath, deflateFilePath);
            }
        }