2013-06-28 21 views
0

考慮下面的代碼:breezejs:混淆從數據庫中獲取實體VS從緩存中

function getPersonById(personId, type) { 

var p1 = new breeze.Predicate("Id", "==", personId);  
var p2 = new breeze.Predicate("Type", "==", type);   
var query = breeze.EntityQuery.from("Contacts").where(p1.and(p2)) 

if (!manager.metadataStore.hasMetadataFor(service.serviceName)) { 
     return manager.fetchMetadata().then(function() { 
      return manager.executeQuery(query.using(service)); 
     }); 
} else { 
     var fromCache = manager.getEntityByKey('Contact', personId); 
     if (fromCache) 
      return Q.resolve(fromCache); 
     return manager.executeQuery(query.using(service)); 
} 
} 
  1. 我做事情的正確方法是什麼?在我看來,爲了獲取實體,我必須編寫大量的樣板代碼。我必須確保元數據是已知的,然後如果實體已經在緩存中。

  2. 我面臨一個問題,因爲如果executeQuery被調用,那麼返回值是一個數組。但是,如果調用getEntityByKey,則返回值是一個實體。我怎樣才能以優雅的方式處理這個問題?有沒有辦法強制executeQuery返回一個單一的實體而不是數組? (無論如何,我只希望只有一個返回值)

回答

1

您的元數據測試不應該是每個查詢所必需的。如果添加處理任何錯誤(例如無元數據)的失敗方法,則只能編寫一次,但實際上,如果正在使用的服務類型JavaScript文件已加載,則元數據應始終存在。如果您正在將數據卡移至視圖模型,那麼我會建議重新考慮該策略。

你正在做你的緩存檢查的方式是可選的。請記住,有兩種方法可以從緩存中進行查詢 - executeQueryLocally並設置fetchStrategy。在某些情況下,您會希望從服務器刷新數據,因此我肯定會建議先嚐試從每個查詢中緩存中提取數據,並僅根據需要轉到數據庫。通常,對於每個實體,我只有兩種方法可用於我的所有數據檢索,但如果您非常棘手,那麼也可以將其減少爲共享查詢。您的查詢是最有效的,當你可以重新使用它們針對不同的排序依據的,where子句,等等

最後,如果你想只返回一個單一的實體只是去做lklike你會任何其他陣列 - 趕上返回數組結果發回給他們,並過濾到像data.results [0]之類的東西。您也可以查詢並使用過濾器來查找符合正弦條件的第一個實體。