Как использовать LazyCache с функцией asyn c, которая принимает параметр - PullRequest
0 голосов
/ 18 января 2020

Я пытаюсь использовать 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

1 Ответ

0 голосов
/ 18 января 2020

У меня работает с небольшими изменениями:

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));
    }
}
...