public T GetOrAdd <T>(string key, Func <T> valueFactory, Action <ICacheConfiguration> configurator) { key.ThrowIfNullOrEmpty(); valueFactory.ThrowIfNull(); try { if (Contains(key)) { return((T)Cache[key]); } var policy = new CachePolicyFactory().Create(configurator); var value = valueFactory(); if (!typeof(T).IsValueType && value == null) { return(default(T)); } Cache.Add(key, value, policy); return(value); } catch (Exception) { Cache.Remove(key); throw; } }
public async Task <T> GetOrAddAsync <T>(string key, Func <Task <T> > valueFactory, Action <ICacheConfiguration> configurator) { var policy = new CachePolicyFactory().Create(configurator); var asyncLazyValue = new LazyAsync <T>(valueFactory); var existingValue = (LazyAsync <T>)Cache.AddOrGetExisting(KeyPrefix + key, asyncLazyValue, policy); if (existingValue != null) { asyncLazyValue = existingValue; } try { var result = await asyncLazyValue; if (asyncLazyValue != Cache.AddOrGetExisting(KeyPrefix + key, new LazyAsync <T>(valueFactory), policy)) { return(await GetOrAddAsync(KeyPrefix + key, valueFactory, configurator)); } return(result); } catch (Exception) { await RemoveAsync(KeyPrefix + key); throw; } }