例如,我有一些存储库来获取我需要的一些数据:
Addressrepository.GetAddress(string para1, string para2)
UserRepository.GetUserDetail(string userName)
FinancialRepository.GetFinancialInfo(int userId)
要应用缓存模式,我想这样做:
理想情况下,我想编写一个通用的辅助类来为所有数据加载函数执行此操作。这里描述的缓存一边模式:https://blog.cdemi.io/design-patterns-cache-aside-pattern/
但是,就我而言,我需要将不同的参数传递给不同的方法。在这种情况下,是否可以使用Func并传递不同的参数?
我查了msdn这个:
Func<T1, T2, T3, T4, T5, T6, T7, T8, TResult> Delegate
但是如何传递不同的类型参数和不同数量的参数?
最简单的方法是根本不传递参数,而是进行变量捕获。
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的模式相同。