我正在设计Windows Phone应用程序
该应用程序将从互联网(JSON流)下载一些数据。这样的流可以在尺寸上大得多,并且数量也是多个(大约30-40)
我希望应用程序具有非常高的性能,并使用这样的流实现某种缓存机制
保留此类数据的最佳方法是什么。在Multiple Variables
或Use File Storage
。
答案 0 :(得分:0)
我不确定这是最好的方法,但我所做的是:
IsolatedStorage
中,文件大小或文件数量没有限制,您可以有效地存储在那里,请记住不要过分。这是我的设置:
Backend是一个WebAPI应用程序,它返回数据传输对象的可用数据。
手机应用程序共享相同的数据传输对象,并具有Repository类 - 它公开了以下方法。
我有一个SimpleRepository
抽象类,它暴露了以下抽象方法:
Fetch(string query); //fetch the data from the data source
Store(); // Store the data somewhere
根据这些内容,它会为您实现First(string query)
Fetch()
和First()
。
然后,我有一个CachingRepository
类,如果可用则在本地加载数据,如果不是,则从Web加载,它假定是JSON。
它有一个构造函数,如下所示:
CachingRepository(string name, CacheDuration duration,string id)
repo的名称与后端的资源相同,因此例如名为“Cats”的存储库在后端具有相应的/api/phone/Cats
RESTful资源。 id
用于将其与同一资源的其他存储库区分开来。 CacheDuration
是我所拥有的常见缓存持续时间的枚举,但TimeSpan也可以工作。
存储库有两个通用参数 - T
,它实现ViewModel<U>
类(实现INotifyPropertyChanged
并使用DTO作为模型 - 虽然这可能对您的使用来说太简单了)实现TipRanksDTO的U
。
Fetch看起来像:
public async Task<IEnumerable<T>> Fetch(string queryString)
{
var localResult = await fetchFromLocal(queryString);
if(localResult != null){
return localResult;
}
return await fetchFromServer();
}
fetchFromLocal
是一种私有异步方法,在验证文件未在缓存持续时间之前被修改后,从应用程序的IsolatedStorage
获取数据。如果无法在本地获取,则会尝试使用HttpClient
从Web获取。两者都使用Newtonsoft.JSON将文件/ Web响应直接转换为C#对象(我之前的DTO)。
现在,Store同样简单 - 只需打开IsolatedStorage
并将DTO的序列化版本推送到数据库,它接受ViewModels。
每个ViewModel都有一个指向DTO的Model
属性。如果使用DTO和模型对您不够,或者您希望以后将任何内容保存到服务器,您可能希望在DTO和模型之间有一个额外的步骤。
然后,用法如下:
OnPageLoaded += (sender,args) => {
var repo = new CachingRepository("Cats",CachingDuration.Daily);
var cats = await repo.Fetch();
pageViewModel.cats.Replace(cats); //update the ObservableCollection on the VM.
repo.Store(cats);
}