使用Rx缓存来自webservice的结果并在C#UWP应用程序中本地使用

问题描述 投票:2回答:2

我有一个UWP应用程序,我调用Web服务从服务器获取产品列表。

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实现这一目标。

c# caching uwp system.reactive
2个回答
1
投票

这项工作会简单吗?

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();
}

0
投票

你正在寻找的是一个依赖注入的ServiceCollection。您可以通过microsoft查看此sample application。这有助于我在从api检索应用程序后在整个应用程序中保存服务。

你必须使用AddSingleton返回相同的对象。 AddTransient将返回不同的对象。 AddScoped将根据您调用的范围返回。

© www.soinside.com 2019 - 2024. All rights reserved.