<PackageReference Include="Microsoft.Extensions.Configuration" Version="10.0.0-preview.1.25080.5" />

ReferenceCountedProviderManager

using System; using System.Collections.Generic; using System.Runtime.CompilerServices; namespace Microsoft.Extensions.Configuration { [NullableContext(1)] [Nullable(0)] internal sealed class ReferenceCountedProviderManager : IDisposable { private readonly object _replaceProvidersLock = new object(); private ReferenceCountedProviders _refCountedProviders = ReferenceCountedProviders.Create(new List<IConfigurationProvider>()); private bool _disposed; public IEnumerable<IConfigurationProvider> NonReferenceCountedProviders => _refCountedProviders.NonReferenceCountedProviders; public ReferenceCountedProviders GetReference() { lock (_replaceProvidersLock) { if (!_disposed) { _refCountedProviders.AddReference(); return _refCountedProviders; } return ReferenceCountedProviders.CreateDisposed(_refCountedProviders.NonReferenceCountedProviders); } } public void ReplaceProviders(List<IConfigurationProvider> providers) { ReferenceCountedProviders refCountedProviders = _refCountedProviders; lock (_replaceProvidersLock) { if (_disposed) throw new ObjectDisposedException("ConfigurationManager"); _refCountedProviders = ReferenceCountedProviders.Create(providers); } refCountedProviders.Dispose(); } public void AddProvider(IConfigurationProvider provider) { lock (_replaceProvidersLock) { if (_disposed) throw new ObjectDisposedException("ConfigurationManager"); _refCountedProviders.Providers = new List<IConfigurationProvider>(_refCountedProviders.Providers) { provider }; } } public void Dispose() { ReferenceCountedProviders refCountedProviders = _refCountedProviders; lock (_replaceProvidersLock) { _disposed = true; } refCountedProviders.Dispose(); } } }