我有一个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
实现这一目标。
这项工作会简单吗?
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查看此sample application。这有助于我在从api检索应用程序后在整个应用程序中保存服务。
你必须使用AddSingleton
返回相同的对象。 AddTransient
将返回不同的对象。 AddScoped
将根据您调用的范围返回。