Beispiel #1
0
 public IObservable <T> FetchData <T>(RestSettings <T> settigns)
 {
     return(Task.Run(async() =>
     {
         using (var httpResult = await _httpClient.SendAsync(settigns.RequestMessage))
         {
             var data = await httpResult.Content.ReadAsStringAsync();
             var parsedData = settigns.Parser.Parse(data);
             return parsedData;
         }
     }).ToObservable());
 }
Beispiel #2
0
        public async Task <T> SendAsync <T>(RestSettings <T> settigns,
                                            Func <Tuple <T, DateTimeOffset?>, bool> fetchPredicate = null,
                                            Action <T> beforeLoading   = null,
                                            Action <Exception> onError = null)
        {
            var  key         = Utility.Md5Calculator.ComputeMd5(settigns.RequestMessage.RequestUri.OriginalString);
            bool?reload      = null;
            var  cachedValue = default(T);
            var  createdItem = await BlobCache.LocalMachine.GetObjectCreatedAt <T>(key);

            if (createdItem == null)
            {
                reload = fetchPredicate?.Invoke(Tuple.Create(default(T), createdItem)) ?? true;
            }
            else
            {
                cachedValue = await BlobCache.LocalMachine.GetObject <T>(key);
            }

            var value = cachedValue;

            if (settigns.Mode == RequestAccessMode.Cache)
            {
                return(value);
            }

            reload = reload ?? fetchPredicate?.Invoke(Tuple.Create(value, createdItem)) ?? true;
            if (reload.Value)
            {
                try
                {
                    beforeLoading?.Invoke(cachedValue);
                    value = await FetchData(settigns);
                }
                catch (Exception ex)
                {
                    value = cachedValue;
                    onError?.Invoke(ex);
                }

                await BlobCache.LocalMachine.InsertObject(key, value, DateTimeOffset.Now.AddDays(10));
            }

            return(value);
        }