alastairtree / LazyCache

An easy to use thread safe in-memory caching service with a simple developer friendly API for c#
https://nuget.org/packages/LazyCache
MIT License
1.72k stars 159 forks source link

Add TryGetValueAsync that evaluates GetValueFromAsyncLazy #168

Open b-twis opened 3 years ago

b-twis commented 3 years ago

[Use the Thumbs Up reaction to vote for this feature, and please avoid adding comments like "+1" as they create noise for others watching the issue.]

Firstly, actively using your library in multiple places for quite some time and very happy with it.

In the recent inclusion of PR #142 when adding TryGetValue I dont feel like it fits the theme of the library as it does not perform GetValueFromAsyncLazy so it could give you back a factory (AsyncLazy) instead of the actual value

I read the comments and the end goal was something close to a cache.contains (and you can not out param an async method), but would be great it is also fit normal pattern of the other Gets.

I did something similar to below using a wrapper class to handle a similar issue elsewhere.

Here is an attempt of it in LazyCache.

public class CacheResponse<TV>
{
    public bool Found { get; set; }
    public string Key { get; set; }
    public TV Value { get; set; }
}

public virtual async Task<CacheResponse<T>> TryGetValueAsync<T>(string key)
{
    ValidateKey(key);

    if (CacheProvider.TryGetValue(key, out T item))
    {                
        return new CacheResponse<T>() { Found = true, Key = key, Value = await GetValueFromAsyncLazy<T>(item, out _) };
    } else
    {
        return new CacheResponse<T>() { Found = false, Key = key};
    }
}

Thoughts? I can make look at making a PR if you are interested.

Thanks,

Basil

EnricoMassone commented 3 years ago

Hello @b-twis I agree with you.

A few months ago I proposed a pull request already including the idea of a TryGetValueAsync

This is my pull request: https://github.com/alastairtree/LazyCache/pull/157

If you like we can discuss about this and propose a new pull request with the TryGetValueAsync improvement only