2017-06-12 94 views
1

例如,我有一些倉庫抓一些數據,我需要:什麼是實現緩存保留模式的好方法?

Addressrepository.GetAddress(string para1, string para2) 

UserRepository.GetUserDetail(string userName) 

FinancialRepository.GetFinancialInfo(int userId) 

要應用緩存預留的模式,我想這樣做:

  1. 基礎上傳遞的參數和一些每個 存儲庫的標識符,構造一個密鑰。
  2. 檢查內存緩存(或者如果我們按照該路線執行redis緩存)。
  3. 如果無法找到或過期信息,請調用存儲庫函數來抓取數據並將其放入緩存。

理想我想編寫一個通用助手類爲所有數據加載functions.Something喜歡一邊這裏所描述的圖案緩存做到這一點: https://blog.cdemi.io/design-patterns-cache-aside-pattern/

然而,在我的情況,我需要通過不同的方法參數不同。在這種情況下,是否可以使用Func並傳遞不同的參數?

我查MSDN一下:

Func<T1, T2, T3, T4, T5, T6, T7, T8, TResult> Delegate 

但我怎麼通過不同類型的參數和不同數量的參數?

+0

基於您的要求的模糊性「將不同的參數傳遞給不同的方法」有點難以回答。你能舉一些例子來說明你想做什麼嗎? –

回答

3

最簡單的方法是不傳遞參數,而是進行變量捕獲。

public T GetOrAdd<T>(string key, Func<T> builder) 
{ 
    var result = _someCache.Get<T>(key); 
    if(result != null) 
     return result; 

    result = builder(); 
    _someCache.Add(key, result); 
    return result; 
} 

使用像

var address = myCache.GetOrAdd<Address>(AddressKeyBuilder(para1, para2), 
             () => Addressrepository.GetAddress(para1, para2) 
             ); 

這是相同的模式ConcurrentDictionary使用了它的GetOrAdd method

相關問題