1

我設計一個Windows Phone應用程序。
該應用程序將從互聯網上下載一些數據(JSON流)。這樣的流可能在尺寸上大得多並且數量也是多個(大約30-40)。
我希望應用程序有非常高的性能,並實現某種緩存機制,例如流。
保存這些數據的最佳方法是什麼?在Multiple VariablesUse File Storage的最佳方式和內存

回答

0

我不知道這是最好的方式,但我做的是:

  • 從網上下載的數據的第一時間(JSON流)
  • 對每個高速緩存持續時間項目,取決於它直接在IsolatedStorage類型
  • 商店,有文件的大小,也可以有效地存儲在那裏的文件的數量沒有限制,只要記住不要走極端。
  • 我並不需要快速查詢局部數據中的數據,而是使用的數據完全是這樣的這個作品出來,我不是使用數據庫好得多。

這裏是我的設置:

後端是一個應用程序的WebAPI返回的數據傳輸對象的可枚舉。

電話應用共享相同的數據傳輸對象,並且具有一個存儲庫類 - 其公開以下方法。

我有一個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) 

回購的名稱是相同的後端資源,因此,例如一個名爲「貓」庫對一個corrosponding /api/phone/Cats REST的資源後端。 id將區別於同一資源的其他存儲庫。 CacheDuration是我擁有的常見緩存持續時間的枚舉,但TimeSpan也可能有效。

存儲庫有兩個泛型參數 - T它實現了一個ViewModel<U>類(實現INotifyPropertyChanged和使用DTO作爲模型 - 儘管這可能是您的使用過於簡單),並U該implemnets 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的序列化版本推送到數據庫,即可接受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); 
} 
+0

謝謝回答!答案爲我提供了完成任務的方法。 –

+0

下個月我會來芬蘭,我會問那裏的技術人員,如果他們有Ny改進建議,請更新。祝你好運。 –

+0

謝謝!會等待一些好的迴應:) –