【问题标题】:Generic way to try get and set in Cache the result of a method尝试在缓存中获取和设置方法结果的通用方法
【发布时间】:2022-01-06 12:14:05
【问题描述】:

我创建了一个 CacheService 来将任何对象存储在缓存中。每次使用缓存时,我都会执行以下步骤:

string cacheKey = MY_KEY;
var result = await _cacheProvider.TryGet<T>(cacheKey);
if (result.IsSuccessful)
{
     return result.Value;
}

var data = /*...code to get the data...*/ 
await _cacheProvider.Set(cacheKey, data, _settings.LifeTime);
return data;

我想通过创建一个可以做到这一点的助手来避免每次都这样做。我认为代表可以做到这一点,但在阅读了一些内容后,我不再那么确定了。

谢谢

【问题讨论】:

  • 你想要的辅助方法的参数是什么?换句话说,每次使用缓存之间发生了哪些变化?
  • @Sweeper 密钥和数据类型

标签: c# delegates


【解决方案1】:

您可以向缓存提供程序添加扩展方法。像这样的:

public static async Task<T> TryGetOrSet(this ICacheProvider cacheProvider, string cacheKey, ISettings settings, Func<string, T> dataGetter)
{
    var result = await cacheProvider.TryGet<T>(cacheKey);
    if (result.IsSuccessful)
    {
        return result.Value;
    }

    var data = dataGetter(cacheKey);

    await cacheProvider.Set(cacheKey, data, settings.LifeTime);
    return data;
}

如何称呼它:

var data = await _cacheProvider.TryGetOrSet(cacheKey, _settings, key => codeToGetTheData(key));

【讨论】:

  • 它应该确实有效。但我的意图是从方法名称、程序集和参数(带反射)生成 cacheKey
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多