Как реализовать настраиваемый кеш в приложении C # UWP - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть веб-сервис ( ItemWebService ), который вызывает API и получает список элементов ( productList ).Эта услуга вызывается из приложения UWP .

Требования:

  • Кэширование списка продуктов за определенный период времени (например, 1 час) ивернуть кэшированный список , если он доступен и не истекло время ожидания при вызове GetProductListAsync().
  • Нет необходимости кэшировать каждый час, потому что этот процесс будеточень редкий процесс, и приложение UWP выполняется на нескольких устройствах в организации.Поэтому, если установить интервал для кэширования, API будет получать сотни запросов в одно и то же время каждый час.
  • Всякий раз, когда новый элемент добавляется в список продуктов из метода AddProductAsync(AddProductRequest addProductRequest ),кеш должен быть обновлен.

1 Ответ

0 голосов
/ 28 февраля 2019

Для удовлетворения вышеуказанных требований в ItemWebService .

using NodaTime;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using System.Reactive.Threading.Tasks;
using System.Threading.Tasks;

namespace MyNamespace.Products
{
    public class ItemWebService : IItemService
    {
        private readonly IApiRestClient _restClient;
        private readonly string _serviceUrl = "api/products";
        private static IEnumerable<ProductListItem> _cachedProductist = null;
        private readonly IClock _clock;
        private readonly Duration _productlistValidFor = Duration.FromHours(1); // Set the timeout
        private static Instant _lastUpdate = Instant.MinValue;


        public ItemWebService (IApiRestClient restClient)
        {
            _restClient = restClient;
            _clock = SystemClock.Instance; // using NodaTime
        }

        public async Task AddProductAsync(AddProductRequest addProductRequest)
        {
            await _restClient.Put($"{_serviceUrl}/add", addProductRequest);

            // Expire cache manually to update product list on next call
            _lastUpdate = _clock.GetCurrentInstant() - _productlistValidFor ;
        }

        public async Task<IObservable<ProductListItem>> GetProductListAsync()
        {
            if (_cachedProductist == null || (_lastUpdate + _productlistValidFor) < _clock.GetCurrentInstant())
            {
                _cachedProductist = await _restClient.Get<IEnumerable<ProductListItem>>($"{_serviceUrl}/productList");

                // Update the last updated time
                _lastUpdate = _clock.GetCurrentInstant();
            }
            return _cachedProductist.ToObservable();
        }
    }
}

был реализован настраиваемый кеш. С этой реализацией мне удалось избежать установки интервала Это может привести к тому, что сотни вызовов API (потому что на одном и том же приложении работают сотни устройств) обновляют кэш каждый час.

Теперь, когда устройство, на котором запущено приложение UWP, запрашивает список продуктов, служба проверяет, существует ли кэш на этом устройстве, и не истек ли он, и при необходимости вызывает сервер для обновления кеша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...