using System; using System.Linq; using System.Threading.Tasks; namespace Abp.Runtime.Caching { /// /// Extension methods for . /// public static class CacheExtensions { public static object Get(this ICache cache, string key, Func factory) { return cache.Get(key, k => factory()); } public static object[] Get(this ICache cache, string[] keys, Func factory) { return keys.Select(key => cache.Get(key, k => factory())).ToArray(); } public static Task GetAsync(this ICache cache, string key, Func> factory) { return cache.GetAsync(key, k => factory()); } public static Task GetAsync(this ICache cache, string[] keys, Func> factory) { var tasks = keys.Select(key => cache.GetAsync(key, k => factory())); return Task.WhenAll(tasks); } public static ITypedCache AsTyped(this ICache cache) { return new TypedCacheWrapper(cache); } public static TValue Get(this ICache cache, TKey key, Func factory) { return (TValue)cache.Get(key.ToString(), (k) => (object)factory(key)); } public static TValue[] Get(this ICache cache, TKey[] keys, Func factory) { return keys.Select(key => (TValue)cache.Get(key.ToString(), (k) => (object)factory(key))).ToArray(); } public static TValue Get(this ICache cache, TKey key, Func factory) { return cache.Get(key, (k) => factory()); } public static TValue[] Get(this ICache cache, TKey[] keys, Func factory) { return keys.Select(key => cache.Get(key, (k) => factory())).ToArray(); } public static async Task GetAsync(this ICache cache, TKey key, Func> factory) { var value = await cache.GetAsync(key.ToString(), async (keyAsString) => { var v = await factory(key); return (object)v; }); return (TValue)value; } public static async Task GetAsync(this ICache cache, TKey[] keys, Func> factory) { var tasks = keys.Select(key => { return cache.GetAsync(key.ToString(), async (keyAsString) => { var v = await factory(key); return (object)v; }); }); var values = await Task.WhenAll(tasks); return values.Select(value => (TValue)value).ToArray(); } public static Task GetAsync(this ICache cache, TKey key, Func> factory) { return cache.GetAsync(key, (k) => factory()); } public static Task GetAsync(this ICache cache, TKey[] keys, Func> factory) { var tasks = keys.Select(key => cache.GetAsync(key, (k) => factory())); return Task.WhenAll(tasks); } public static TValue GetOrDefault(this ICache cache, TKey key) { var value = cache.GetOrDefault(key.ToString()); if (value == null) { return default(TValue); } return (TValue)value; } public static TValue[] GetOrDefault(this ICache cache, TKey[] keys) { var values = keys.Select(key => { var value = cache.GetOrDefault(key.ToString()); if (value == null) { return default(TValue); } return (TValue)value; }); return values.ToArray(); } public static async Task GetOrDefaultAsync(this ICache cache, TKey key) { var value = await cache.GetOrDefaultAsync(key.ToString()); if (value == null) { return default(TValue); } return (TValue)value; } public static async Task GetOrDefaultAsync(this ICache cache, TKey[] keys) { var tasks = keys.Select(async (key) => { var value = await cache.GetOrDefaultAsync(key.ToString()); if (value == null) { return default(TValue); } return (TValue)value; }); return await Task.WhenAll(tasks); } } }