Tim
Tim

Reputation: 143

is there a Cacheable in C# similar to Java?

In Java Spring Boot, I can easily enable caching using the annotation @EnableCaching and make methods cache the result using @Cacheable, this way, any input to my method with the exact same parameters will NOT call the method, but return immediately using the cached result.

Is there something similar in C#?

What I did in the past was i had to implement my own caching class, my own data structures, its a big hassle. I just want an easy way for the program to cache the result and return the exact result if the input parameters are the same.

EDIT: I dont want to use any third party stuff, so no MemCached, no Redis, no RabbitMQ, etc... Just looking for a very simple and elegant solution like Java's @Cacheable.

Upvotes: 2

Views: 1423

Answers (1)

Maroun
Maroun

Reputation: 95968

You can write a decorator with a get-or-create functionality. First, try to get value from cache, if it doesn't exist, calculate it and store in cache:

public static class CacheExtensions
{
    public static async Task<T> GetOrSetValueAsync<T>(this ICacheClient cache, string key, Func<Task<T>> function)
        where T : class
    {
        // try to get value from cache
        var result = await cache.JsonGet<T>(key);
        if (result != null)
        {
            return result;
        }
        // cache miss, run function and store result in cache
        result = await function();
        await cache.JsonSet(key, result);
        return result;
    }
}

ICacheClient is the interface you're extending. Now you can use:

await _cacheClient.GetOrSetValueAsync(key, () => Task.FromResult(value));

Upvotes: 0

Related Questions