使用RX从Web服务产生缓存,并在C#UWP应用中本地使用



我有一个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()时,它都应查看缓存1,如果存在缓存列表,则返回。

我尝试将局部变量保留在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实现此目标。

是否可以像此工作一样简单吗?

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

您要寻找的是带有依赖项注入的ServiceCollection。您可以查看Microsoft的此示例应用程序。在从API中检索到应用程序后,这对我在整个应用程序中持有服务有所帮助。

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

最新更新