public static void SubscribeWith <TResponse>(this ISubscriptionManager manager, R.ResponsesPaged <TResponse> dto, Q.QueriesPaged <TResponse> query, string session)
        {
            var key = query.GetCacheKey();

            query.SubscriptionType = query.SubscriptionType ?? ChangeType.All;
            foreach (var record in dto.Records)
            {
                manager.Manage(record, key, query.SubscriptionId, query.SubscriptionType ?? ChangeType.All, TimeSpan.FromSeconds(query.SubscriptionTime ?? 3600), session);
            }
            manager.Manage <TResponse>(query, query.SubscriptionId, query.SubscriptionType ?? ChangeType.All, TimeSpan.FromSeconds(query.SubscriptionTime ?? 3600), session);
        }
        public static R.ResponsesPaged <TResponse> ToOptimizedCachedResult <TResponse>(this IRequest request, Q.QueriesPaged <TResponse> query, ICacheClient cache, Func <R.ResponsesPaged <TResponse> > factory)
        {
            var key    = query.GetCacheKey();
            var cached = cache.GetOrCreate(key, () =>
            {
                var result = factory();
                return(result);
            });

            return(cached);
        }
        public static async Task <R.ResponsesPaged <TResponse> > ToOptimizedCachedResult <TResponse>(this IRequest request, Q.QueriesPaged <TResponse> query, ICacheClient cache, Func <Task <R.ResponsesPaged <TResponse> > > factory)
        {
            var key    = query.GetCacheKey();
            var cached = cache.Get <R.ResponsesPaged <TResponse> >(key);

            if (cached == null)
            {
                cached = await factory().ConfigureAwait(false);

                cache.Add(key, cached);
            }

            return(cached);
        }
        public static async Task <R.ResponsesPaged <TResponse> > ToOptimizedCachedAndSubscribedPagedResult <TResponse>(this IRequest request, Q.QueriesPaged <TResponse> query, ICacheClient cache, ISubscriptionManager manager, Func <Task <R.ResponsesPaged <TResponse> > > factory)
        {
            var key    = query.GetCacheKey();
            var cached = cache.Get <R.ResponsesPaged <TResponse> >(key);

            if (cached == null)
            {
                cached = await factory().ConfigureAwait(false);

                cache.Add(key, cached);
            }
            if (!query.SubscriptionId.IsNullOrEmpty())
            {
                manager.SubscribeWith(cached, query, request.GetSessionId());
            }

            return(cached);
        }