<PackageReference Include="Microsoft.Extensions.Configuration" Version="10.0.0-rc.1.25451.107" />

ReferenceCountedProviders

using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Threading; namespace Microsoft.Extensions.Configuration { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] internal abstract class ReferenceCountedProviders : IDisposable { private sealed class ActiveReferenceCountedProviders : ReferenceCountedProviders { private long _refCount = 1; private volatile List<IConfigurationProvider> _providers; public override List<IConfigurationProvider> Providers { get { return _providers; } set { _providers = value; } } public override List<IConfigurationProvider> NonReferenceCountedProviders => _providers; public ActiveReferenceCountedProviders(List<IConfigurationProvider> providers) { _providers = providers; } public override void AddReference() { Interlocked.Increment(ref _refCount); } public override void Dispose() { if (Interlocked.Decrement(ref _refCount) == 0) { foreach (IConfigurationProvider provider in _providers) { (provider as IDisposable)?.Dispose(); } } } } private sealed class DisposedReferenceCountedProviders : ReferenceCountedProviders { public override List<IConfigurationProvider> Providers { get; set; } public override List<IConfigurationProvider> NonReferenceCountedProviders => Providers; public DisposedReferenceCountedProviders(List<IConfigurationProvider> providers) { Providers = providers; } public override void AddReference() { } public override void Dispose() { } } public abstract List<IConfigurationProvider> Providers { get; set; } public abstract List<IConfigurationProvider> NonReferenceCountedProviders { get; } public static ReferenceCountedProviders Create(List<IConfigurationProvider> providers) { return new ActiveReferenceCountedProviders(providers); } public static ReferenceCountedProviders CreateDisposed(List<IConfigurationProvider> providers) { return new DisposedReferenceCountedProviders(providers); } public abstract void AddReference(); public abstract void Dispose(); } }