2017-06-12 84 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

相关问题