Использование Rx для кэширования результатов из веб-сервиса и локального использования в приложении C # UWP - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть приложение UWP, в котором я вызываю веб-службу для получения списка продуктов с сервера.

ItemWebService

public async Task<IObservable<ProductListItem>> GetProductlistAsync()
{
     var productList = await _restClient.Get<IEnumerable<ProductListItem>>($"{_serviceUrl}/productlist");
     return productList.ToObservable();
}

ProductListItemкласс

public class ProductListItem
{
    public int Id { get; set; }
    public string SkuValue{ get; set; }
}

Я хочу кэшировать productList в течение определенного периода времени (например, скажем, 10 минут).Всякий раз, когда вызывается GetProductlistAsync(), он должен сначала смотреть в кэш и возвращать, если присутствует кэшированный список.

Я пытался сохранить локальную переменную в ItemWebService для кэширования списка.Но всякий раз, когда пользователь переходит на другую страницу, переменная очищается.

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

Ниже приведен код, который я пробовал.

private IObservable<ProductListItem> cachedProductList;

if (cachedProductList == null)
{
   var dbProductList = await GetProductlistAsync();
   var period = TimeSpan.FromSeconds(20);
   var observable = Observable.Interval(period).Publish();
   observable.Connect();
   observable.Subscribe(async l =>
                           {
                               cachedProductList = await 
                               GetProductlistAsync().ToObservable().Replay();
                           }
                        );
}

Я хочу добиться этого с помощью Rx Extensions.

Ответы [ 2 ]

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

То, что вы ищете, это ServiceCollection с внедрением зависимости.Вы можете взглянуть на это пример приложения от Microsoft.Это помогло мне в моем случае использования Сервиса в приложении после его извлечения из API.

В котором вы должны использовать AddSingleton, чтобы вернуть тот же объект.AddTransient вернет разные объекты.AddScoped вернется в зависимости от объема, который вы вызываете.

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

Будет ли что-нибудь столь же простое, как эта работа?

private static IEnumerable<ProductListItem> _productList = null;
public async Task<IObservable<ProductListItem>> GetProductlistAsync()
{

    var productList = _productList;
    if (productList == null)
    {
        _productList = await _restClient.Get<IEnumerable<ProductListItem>>($"{_serviceUrl}/productlist");
        productList = _productList;
        Observable.Timer(TimeSpan.FromHours(1.0)).Subscribe(x => _productList = null);
    }
    return productList.ToObservable();
}
...