【问题标题】:How to use LazyCache with async function that takes parameter如何将 LazyCache 与带参数的异步函数一起使用
【发布时间】:2020-01-17 22:45:22
【问题描述】:

我正在尝试使用LazyCache。该 API 有 GetOrAddAsync,它采用 Func<Task<T>>。这是构建我想要缓存的东西的函数。
但是我拥有的函数需要输入参数。我的函数的签名是Func<int,Task<T>>

正如预期的那样,我得到了编译错误

cannot convert from 'System.Func<int, System.Threading.Tasks.Task<string>>' to 'System.Func<Microsoft.Extensions.Caching.Memory.ICacheEntry, System.Threading.Tasks.Task<string>>'

如何将输入参数传递给我的函数?

public class MyCacheService
{
    private readonly IAppCache _cache = null;        

    public MyCacheService(IAppCache cache)
    {
        _cache = cache;
    }

    public async Task<string> Find(int key, Func<int, Task<string>> func)
    {
        //?? compilation error here
        // i want to pass key to function as input parameter
        return await _cache.GetOrAddAsync<string>(key.ToString(), func);
    }
}


public class DatabaseService
{
    public async Task<string> GetStringFromDataBase(int id)
    {
        await Task.FromResult(0);
        return "Some string from database based on input parameter id";
    }
}

public class Worker
{
    private readonly MyCacheService _cacheService;
    private readonly DatabaseService _databaseService;

    public Worker(MyCacheService cacheService, DatabaseService databaseService)
    {
        _cacheService = cacheService;
        _databaseService= databaseService;
    }

    public async Task DoWork()
    {
        await _cacheService.Find(1234, _databaseService.GetStringFromDataBase);
    }
}

DOTNETFIDDLE

【问题讨论】:

    标签: asp.net-core .net-core coreclr memorycache lazycache


    【解决方案1】:

    它对我有一些小的变化:

    public class MyCacheService
    {
        private readonly IAppCache _cache = null;
    
        public MyCacheService(IAppCache cache)
        {
            _cache = cache;
        }
    
        public async Task<string> Find(int key, Func<ICacheEntry, Task<string>> func)
        {
            return await _cache.GetOrAddAsync<string>(key.ToString(), func);
        }
    }
    
    public class DatabaseService
    {
        public async Task<string> GetStringFromDataBase(ICacheEntry entity)
        {            
            await Task.FromResult(int.Parse(entity.Key.ToString()));
            return "Some string from database based on input parameter id";
        }
    }
    
    public class Worker
    {
        private readonly MyCacheService _cacheService;
        private readonly DatabaseService _databaseService;
    
        public Worker(MyCacheService cacheService, DatabaseService databaseService)
        {
            _cacheService = cacheService;
            _databaseService = databaseService;
        }
    
        public async Task DoWork()
        {
            await _cacheService.Find(1234, (ICacheEntry x) => _databaseService.GetStringFromDataBase(x));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-20
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 2021-11-16
      相关资源
      最近更新 更多