2009-10-27 42 views
0

即可使用的存儲庫,可以說,我有一個DataRepository類的方法,getNames()和的getStates()。可以說這些數據存儲在一個昂貴的操作的web服務或數據庫中。什麼是最好的做法,當你需要做昂貴的檢索

一旦第一個查詢運行並返回,當消費者詢問這些方法時,它會立即返回,因爲結果會緩存在DataRepository類中。

問題是,對於第一次調用,您希望行爲爲異步,以避免阻塞此昂貴的調用。對此進行編碼的最佳方式是什麼?事實是這個DataRepository類正在進行實際的跨邊界檢索和緩存破壞單一可恢復性原則。

關於最佳實踐的任何其他想法?

回答

1

爲你想 行爲第一次調用是異步避免這種昂貴的呼叫阻塞 。 什麼是編碼這個最好的方法?

這是一個來電者的關注。最好提供同步和異步接口,以便客戶可以決定哪些適合他們的情況。

的是,這DataRepository 類是既做實際橫 boundry檢索和緩存 打破單一職責原則 的事實。

是的,如果存儲庫類本身涉及檢索和緩存實現,它會打破SRP。而且,關於命中哪個源的決定通常需要重要的邏輯,這是將這些功能分爲不同類的另一個很好的理由。 (有了標準警告:如果YAGNI,那麼不要這樣做!)

1

知道它是否被稱爲異步是否真的是知識庫的責任?我認爲它只會打電話並返回它的數據,它如何被調用並不是它的照顧。我也不認爲這是它的責任來存儲數據....如果你想存儲數據,調用者(可能有一些中介)可以存儲它。存儲庫應該非常簡單....請求數據並返回數據。或者甚至返回IQueryable,讓需要數據的塊實際上獲取數據...

0

如果必須進行第一次調用異步,那麼也可以使所有調用異步。這將使您的代碼更易於編寫和理解。您不必處理2個不同的通話模式。

數據存儲庫應該負責一件事:將數據傳送給用戶。它從數據存儲中檢索數據。那個數據存儲可能是對WS或DB的昂貴的調用或者來自緩存的廉價調用。數據存儲庫可以檢查緩存中是否存在數據,然後返回該數據或從WS或DB獲取數據,將其放入緩存中並返回。

相關問題