实现缓存模式的好方法是什么?

问题描述 投票:4回答:1

例如,我有一些存储库来获取我需要的一些数据:

Addressrepository.GetAddress(string para1, string para2)

UserRepository.GetUserDetail(string userName)

FinancialRepository.GetFinancialInfo(int userId)

要应用缓存模式,我想这样做:

  1. 基于传入的参数和每个存储库的一些标识符,构造一个键。
  2. 检查内存缓存(如果我们关闭该路由,则检查redis缓存)。
  3. 如果无法找到或过期信息,请调用存储库函数以获取数据并将其放入缓存中。

理想情况下,我想编写一个通用的辅助类来为所有数据加载函数执行此操作。这里描述的缓存一边模式:https://blog.cdemi.io/design-patterns-cache-aside-pattern/

但是,就我而言,我需要将不同的参数传递给不同的方法。在这种情况下,是否可以使用Func并传递不同的参数?

我查了msdn这个:

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

但是如何传递不同的类型参数和不同数量的参数?

c# caching design-patterns
1个回答
8
投票

最简单的方法是根本不传递参数,而是进行变量捕获。

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的模式相同。

© www.soinside.com 2019 - 2024. All rights reserved.