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();
}
}
}