我正在设计一个 Windows Phone 应用程序。
该应用程序将从互联网(JSON 流)下载一些数据。这样的流的大小可能要大得多,数量也可能是多倍的(大约 30-40 )。
我希望应用程序具有非常高的性能,并通过此类流实现某种缓存机制。
保留此类数据的最佳方法是什么。在Multiple Variables
或中Use File Storage
。
1 回答
我不确定这是最好的方法,但我所做的是:
- 第一次从网络下载数据(JSON 流)
- 每个项目都有一个缓存持续时间,具体取决于类型
- 将其直接存储在 中
IsolatedStorage
,您可以有效存储在那里的文件大小或文件数量没有限制,请记住不要过火。 - 我不需要快速查询数据以获取部分数据,而是完全使用数据,因此这对我来说比使用数据库好得多。
这是我的设置:
后端是一个 WebAPI 应用程序,返回数据传输对象的可枚举。
手机应用程序共享相同的数据传输对象,并有一个 Repository 类 - 它公开了以下方法。
我有一个SimpleRepository
抽象类,它公开了以下抽象方法:
Fetch(string query); //fetch the data from the data source
Store(); // Store the data somewhere
基于这些,它为您First(string query)
Fetch()
和First()
.
然后,我有一个CachingRepository
类,如果可用,则在本地加载数据,如果不可用,则从网络加载数据,它假定为 JSON。
它有一个构造函数,如下所示:
CachingRepository(string name, CacheDuration duration,string id)
存储库的名称与后端的资源相同,例如,名为“Cats”的存储库在/api/phone/Cats
后端具有对应的 RESTful 资源。这id
是为了将其与同一资源的其他存储库区分开来。CacheDuration
是我拥有的常见缓存持续时间的枚举,但 TimeSpan 也可能有效。
存储库有两个通用参数——T
它实现了一个ViewModel<U>
类(实现INotifyPropertyChanged
并使用 DTO 作为模型——尽管这对你的使用来说可能太简单了)并且U
实现了 TipRanksDTO。
获取看起来像:
public async Task<IEnumerable<T>> Fetch(string queryString)
{
var localResult = await fetchFromLocal(queryString);
if(localResult != null){
return localResult;
}
return await fetchFromServer();
}
fetchFromLocal
是一个私有异步方法,它IsolatedStorage
在验证文件在缓存持续时间之前没有被修改后从应用程序中获取数据。如果无法在本地获取,它会尝试使用HttpClient
. 两者都使用 Newtonsoft.JSON 将文件/Web 响应直接转换为 C# 对象(我之前的 DTO)。
现在,Store 同样简单——它所做的只是打开IsolatedStorage
并将 DTO 的序列化版本推送到数据库,它接受 ViewModel。
每个 ViewModel 都有一个Model
指向 DTO 的属性。如果使用 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);
}