public async Task <T> GetOrCreate(string inputKey, Func <Task <T> > createItem)
        {
            var key = _scopeProvider.ApplyCurrentScope(inputKey);
            T   cacheEntry;

            if (_cache.TryGetValue(key, out cacheEntry))
            {
                return(cacheEntry);
            }

            var creationLock = await AcquireCacheEntryCreationLock(key);

            try
            {
                if (!_cache.TryGetValue(key, out cacheEntry))
                {
                    cacheEntry = await createItem();

                    _cache.Set(key, cacheEntry, DateTimeOffset.Now.Add(_cacheDuration));
                }
            }
            finally
            {
                creationLock.Release();
            }

            return(cacheEntry);
        }