public async Task <RepositoryResult <KursnaListaZaDan> > NajnovijaKursnaListaAsync(CancellationToken cancellationToken)
        {
            var item = await _cacheService.GetAsync <KursnaListaZaDan>(KursnaListaLatestDataKey).ConfigureAwait(false);

            if (item.HasValue)
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    return(RepositoryResult <KursnaListaZaDan> .Create(item.Value, IsCurrent(item)));
                }
                if (IsCurrent(item))
                {
                    return(item.Value);
                }
            }
            var data = await _kursnaListaDataService.GetNajnovijaKursnaListaAsync(cancellationToken).ConfigureAwait(false);

            if (data != null)
            {
                await _cacheService.PutAsync(KursnaListaLatestDataKey, data).ConfigureAwait(false);
            }
            else
            {
                if (item.HasValue)
                {
                    return(RepositoryResult <KursnaListaZaDan> .Create(item.Value, false));
                }
            }
            return(data);
        }
        protected async Task <RepositoryResult <T> > LoadFromCacheThenRefreshAsync <T>(
            string key,
            DateTime?updatedTime,
            Func <T, DateTime> updatedTimeFunc,
            TimeSpan staleAfter,
            TimeSpan expireAfter,
            Func <Task <ServiceResult <T> > > getDataFuncAsync,
            Func <RepositoryResult <T>, Task> refreshActionAsync = null
            )
        {
            try
            {
                var useUpdatedTime = updatedTime != null;
                var cacheItem      = useUpdatedTime
                    ? await _cacheService.GetAsync <T>(key, updatedTime.Value)
                    : await _cacheService.GetAsync <T>(key);

                if (cacheItem.HasValue &&
                    !cacheItem.IsStale &&
                    !cacheItem.IsExpired)
                {
                    return(RepositoryResult <T> .Create(cacheItem.Value));
                }

                if (cacheItem.HasValue &&
                    cacheItem.IsStale &&
                    !cacheItem.IsExpired &&
                    refreshActionAsync != null)
                {
                    refreshActionAsync(RepositoryResult <T> .Create(cacheItem.Value, false));
                }

                var serviceResult = await getDataFuncAsync().ConfigureAwait(false);

                if (serviceResult.Successful)
                {
                    if (useUpdatedTime)
                    {
                        // ReSharper disable once CSharpWarnings::CS4014, no need to wait storage operation
                        _cacheService.PutAsync(key, updatedTimeFunc(serviceResult.Value), serviceResult.Value,
                                               DateTime.Now + staleAfter, DateTime.Now + expireAfter);
                    }
                    else
                    {
                        // ReSharper disable once CSharpWarnings::CS4014, no need to wait storage operation
                        _cacheService.PutAsync(key, serviceResult.Value,
                                               DateTime.Now + staleAfter, DateTime.Now + expireAfter);
                    }
                }
                return(serviceResult);
            }
            catch (Exception xcp)
            {
                return(RepositoryResult <T> .CreateError(xcp));
            }
        }
Example #3
0
 public async Task <RepositoryResult <KursnaListaZaDan> > NajnovijaKursnaListaAsync(CancellationToken cancellationToken)
 {
     return(RepositoryResult <KursnaListaZaDan> .Create(_kursnaListZaDan, true));
 }