/// <summary>
        /// Returns taxonomy groups.
        /// </summary>
        /// <param name="parameters">A collection of query parameters, for example, for paging.</param>
        /// <returns>The <see cref="DeliveryTaxonomyListingResponse"/> instance that represents the taxonomy groups. If no query parameters are specified, all taxonomy groups are returned.</returns>
        public async Task <DeliveryTaxonomyListingResponse> GetTaxonomiesAsync(IEnumerable <IQueryParameter> parameters)
        {
            var identifierTokens = new List <string> {
                KenticoCloudCacheHelper.TAXONOMY_GROUP_LISTING_IDENTIFIER
            };

            identifierTokens.AddNonNullRange(KenticoCloudCacheHelper.GetIdentifiersFromParameters(parameters));

            return(await CacheManager.GetOrCreateAsync(
                       identifierTokens,
                       () => DeliveryClient.GetTaxonomiesAsync(parameters),
                       response => response.Taxonomies.Count <= 0,
                       GetTaxonomyListingDependencies,
                       ProjectOptions.CreateCacheEntriesInBackground));
        }
        public async Task <DeliveryItemListingResponse <T> > GetItemsAsync <T>(IEnumerable <IQueryParameter> parameters)
        {
            var identifierTokens = new List <string> {
                KenticoCloudCacheHelper.CONTENT_ITEM_LISTING_TYPED_IDENTIFIER
            };

            identifierTokens.AddNonNullRange(KenticoCloudCacheHelper.GetIdentifiersFromParameters(parameters));

            return(await CacheManager.GetOrCreateAsync(
                       identifierTokens,
                       () => DeliveryClient.GetItemsAsync <T>(parameters),
                       response => response.Items.Count <= 0,
                       GetContentItemListingDependencies,
                       ProjectOptions.CreateCacheEntriesInBackground));
        }
        /// <summary>
        /// Gets one strongly typed content item by its codename.
        /// </summary>
        /// <typeparam name="T">Type of the code-first model. (Or <see cref="object"/> if the return type is not yet known.)</typeparam>
        /// <param name="codename">The codename of a content item.</param>
        /// <param name="parameters">A collection of query parameters, for example for projection or depth of linked items.</param>
        /// <returns>The <see cref="DeliveryItemResponse{T}"/> instance that contains the content item with the specified codename.</returns>
        public async Task <DeliveryItemResponse <T> > GetItemAsync <T>(string codename, IEnumerable <IQueryParameter> parameters = null)
        {
            var identifierTokens = new List <string> {
                KenticoCloudCacheHelper.CONTENT_ITEM_SINGLE_TYPED_IDENTIFIER, codename
            };

            identifierTokens.AddNonNullRange(KenticoCloudCacheHelper.GetIdentifiersFromParameters(parameters));

            return(await CacheManager.GetOrCreateAsync(
                       identifierTokens,
                       () => DeliveryClient.GetItemAsync <T>(codename, parameters),
                       response => response == null,
                       GetContentItemSingleDependencies,
                       ProjectOptions.CreateCacheEntriesInBackground));
        }
        /// <summary>
        /// Returns taxonomy groups.
        /// </summary>
        /// <param name="parameters">A collection of query parameters, for example, for paging.</param>
        /// <returns>The <see cref="DeliveryTaxonomyListingResponse"/> instance that represents the taxonomy groups. If no query parameters are specified, all taxonomy groups are returned.</returns>
        public async Task <DeliveryTaxonomyListingResponse> GetTaxonomiesAsync(IEnumerable <IQueryParameter> parameters)
        {
            var cacheTokens = new List <string> {
                KenticoCloudCacheHelper.TAXONOMY_GROUP_LISTING_IDENTIFIER
            };

            cacheTokens.AddNonNullRange(KenticoCloudCacheHelper.GetIdentifiersFromParameters(parameters));

            return(await _cacheManager.GetOrCreateAsync(
                       cacheTokens,
                       () => _deliveryClient.GetTaxonomiesAsync(parameters),
                       _previewDeliveryClient == null?(Func <Task <DeliveryTaxonomyListingResponse> >) null : () => _previewDeliveryClient.GetTaxonomiesAsync(parameters),
                       response => response.Taxonomies.Count <= 0,
                       _dependencyResolver.GetTaxonomyListingDependencies));
        }
        public async Task <DeliveryItemListingResponse <T> > GetItemsAsync <T>(IEnumerable <IQueryParameter> parameters)
        {
            var cacheTokens = new List <string> {
                KenticoCloudCacheHelper.CONTENT_ITEM_LISTING_TYPED_IDENTIFIER
            };

            cacheTokens.AddNonNullRange(KenticoCloudCacheHelper.GetIdentifiersFromParameters(parameters));

            return(await _cacheManager.GetOrCreateAsync(
                       cacheTokens,
                       () => _deliveryClient.GetItemsAsync <T>(parameters),
                       _previewDeliveryClient == null?(Func <Task <DeliveryItemListingResponse <T> > >) null : () => _previewDeliveryClient.GetItemsAsync <T>(parameters),
                       response => response.Items.Count <= 0,
                       _dependencyResolver.GetItemListingResponseDependencies));
        }
        /// <summary>
        /// Returns a content item.
        /// </summary>
        /// <param name="codename">The codename of a content item.</param>
        /// <param name="parameters">A collection of query parameters, for example for projection or depth of modular content.</param>
        /// <returns>The <see cref="DeliveryItemResponse"/> instance that contains the content item with the specified codename.</returns>
        public async Task <DeliveryItemResponse> GetItemAsync(string codename, IEnumerable <IQueryParameter> parameters)
        {
            var cacheTokens = new List <string> {
                KenticoCloudCacheHelper.CONTENT_ITEM_SINGLE_IDENTIFIER, codename
            };

            cacheTokens.AddNonNullRange(KenticoCloudCacheHelper.GetIdentifiersFromParameters(parameters));

            return(await _cacheManager.GetOrCreateAsync(
                       cacheTokens,
                       () => _deliveryClient.GetItemAsync(codename, parameters),
                       _previewDeliveryClient == null?(Func <Task <DeliveryItemResponse> >) null : () => _previewDeliveryClient.GetItemAsync(codename, parameters),
                       response => response == null,
                       _dependencyResolver.GetItemResponseDependencies));
        }