我有一个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
将根据您所调用的范围返回。