public async Task Invalidate()
        {
            await _syncLock.WaitAsync().ConfigureAwait(false);

            _value = default(ExpirationMetadata <T>);
            _syncLock.Release();
        }
        private async Task <ExpirationMetadata <KeyVaultCertificate[]> > Factory(ExpirationMetadata <KeyVaultCertificate[]> arg)
        {
            using (var scope = serviceScopeFactory.CreateScope())
            {
                var old     = (arg.Result ?? Array.Empty <KeyVaultCertificate>()).ToLookup(k => k.Identifier);
                var options = scope.ServiceProvider.GetService <IOptions <SigingKeyStoreOptions> >();

                var configuration = scope.ServiceProvider.GetRequiredService <IConfiguration>();
                var tokenProvider = scope.ServiceProvider.GetRequiredService <ManagedIdentityTokenProvider>();

                var client = new KeyVaultClient((string authority, string resource, string _) =>
                                                tokenProvider.GetTokenForResourceAsync(authority, resource), scope.ServiceProvider.GetRequiredService <System.Net.Http.IHttpClientFactory>().CreateClient());

                var certsVersions = await client.GetSecretVersionsAsync(options.Value.KeyVaultUri, options.Value.SecretName);

                var certsIds = certsVersions.Where(k => !old.Contains(k.Identifier.Identifier) && (k.Attributes?.Enabled ?? false)).ToArray();
                var secrets  = await Task.WhenAll(certsIds.Select(k => client.GetSecretAsync(k.Identifier.Identifier)));

                return(new ExpirationMetadata <KeyVaultCertificate[]>
                {
                    ValidUntil = DateTimeOffset.UtcNow.AddHours(1),
                    Result = secrets.Select((e, i) =>
                                            new KeyVaultCertificate
                    {
                        Cert = new X509Certificate2(Convert.FromBase64String(e.Value), string.Empty, X509KeyStorageFlags.MachineKeySet),
                        Identifier = certsIds[i].Identifier.Identifier
                    }).Concat(arg.Result ?? Array.Empty <KeyVaultCertificate>()).ToArray()
                });
            }
        }
        public async Task <T> Value()
        {
            await _syncLock.WaitAsync().ConfigureAwait(false);

            try
            {
                if (IsValueCreatedInternal)
                {
                    return(_value.Result);
                }

                var result = await _valueProvider(_value).ConfigureAwait(false);

                _value = result;
                return(_value.Result);
            }
            finally
            {
                _syncLock.Release();
            }
        }