Make ConfigurationManager.Sources public (#66485)
authorfredjeck <frederic.jecker@gmail.com>
Mon, 14 Mar 2022 17:24:58 +0000 (18:24 +0100)
committerGitHub <noreply@github.com>
Mon, 14 Mar 2022 17:24:58 +0000 (12:24 -0500)
* Make ConfigurationManager.Sources public

ConfigurationManager.Sources is now a public property rather than
an explicit interface implementation of  ConfigurationBuilder.Sources.

#61675

src/libraries/Microsoft.Extensions.Configuration/ref/Microsoft.Extensions.Configuration.cs
src/libraries/Microsoft.Extensions.Configuration/src/ConfigurationManager.cs
src/libraries/Microsoft.Extensions.Configuration/tests/ConfigurationManagerTest.cs

index c9719bc..98717cb 100644 (file)
@@ -24,26 +24,11 @@ namespace Microsoft.Extensions.Configuration
     public partial class ChainedConfigurationSource : Microsoft.Extensions.Configuration.IConfigurationSource
     {
         public ChainedConfigurationSource() { }
-        [System.Diagnostics.CodeAnalysis.DisallowNull]
+        [System.Diagnostics.CodeAnalysis.DisallowNullAttribute]
         public Microsoft.Extensions.Configuration.IConfiguration? Configuration { get { throw null; } set { } }
         public bool ShouldDisposeConfiguration { get { throw null; } set { } }
         public Microsoft.Extensions.Configuration.IConfigurationProvider Build(Microsoft.Extensions.Configuration.IConfigurationBuilder builder) { throw null; }
     }
-    public sealed partial class ConfigurationManager : Microsoft.Extensions.Configuration.IConfigurationBuilder, Microsoft.Extensions.Configuration.IConfigurationRoot, System.IDisposable
-    {
-        public ConfigurationManager() { }
-        public string? this[string key] { get { throw null; } set { throw null; } }
-        public IConfigurationSection GetSection(string key) { throw null; }
-        public System.Collections.Generic.IEnumerable<IConfigurationSection> GetChildren() { throw null; }
-        public void Dispose() { throw null; }
-        System.Collections.Generic.IDictionary<string, object> IConfigurationBuilder.Properties { get { throw null; } }
-        System.Collections.Generic.IList<Microsoft.Extensions.Configuration.IConfigurationSource> IConfigurationBuilder.Sources { get { throw null; } }
-        Microsoft.Extensions.Configuration.IConfigurationBuilder IConfigurationBuilder.Add(Microsoft.Extensions.Configuration.IConfigurationSource source) { throw null; }
-        Microsoft.Extensions.Configuration.IConfigurationRoot IConfigurationBuilder.Build() { throw null; }
-        System.Collections.Generic.IEnumerable<IConfigurationProvider> IConfigurationRoot.Providers { get { throw null; } }
-        void IConfigurationRoot.Reload() { throw null; }
-        Primitives.IChangeToken IConfiguration.GetReloadToken() { throw null; }
-    }
     public partial class ConfigurationBuilder : Microsoft.Extensions.Configuration.IConfigurationBuilder
     {
         public ConfigurationBuilder() { }
@@ -58,6 +43,21 @@ namespace Microsoft.Extensions.Configuration
         public static Microsoft.Extensions.Configuration.ConfigurationKeyComparer Instance { get { throw null; } }
         public int Compare(string? x, string? y) { throw null; }
     }
+    public sealed partial class ConfigurationManager : Microsoft.Extensions.Configuration.IConfiguration, Microsoft.Extensions.Configuration.IConfigurationBuilder, Microsoft.Extensions.Configuration.IConfigurationRoot, System.IDisposable
+    {
+        public ConfigurationManager() { }
+        public string? this[string key] { get { throw null; } set { } }
+        System.Collections.Generic.IDictionary<string, object> Microsoft.Extensions.Configuration.IConfigurationBuilder.Properties { get { throw null; } }
+        System.Collections.Generic.IEnumerable<Microsoft.Extensions.Configuration.IConfigurationProvider> Microsoft.Extensions.Configuration.IConfigurationRoot.Providers { get { throw null; } }
+        public System.Collections.Generic.IList<Microsoft.Extensions.Configuration.IConfigurationSource> Sources { get { throw null; } }
+        public void Dispose() { }
+        public System.Collections.Generic.IEnumerable<Microsoft.Extensions.Configuration.IConfigurationSection> GetChildren() { throw null; }
+        public Microsoft.Extensions.Configuration.IConfigurationSection GetSection(string key) { throw null; }
+        Microsoft.Extensions.Primitives.IChangeToken Microsoft.Extensions.Configuration.IConfiguration.GetReloadToken() { throw null; }
+        Microsoft.Extensions.Configuration.IConfigurationBuilder Microsoft.Extensions.Configuration.IConfigurationBuilder.Add(Microsoft.Extensions.Configuration.IConfigurationSource source) { throw null; }
+        Microsoft.Extensions.Configuration.IConfigurationRoot Microsoft.Extensions.Configuration.IConfigurationBuilder.Build() { throw null; }
+        void Microsoft.Extensions.Configuration.IConfigurationRoot.Reload() { }
+    }
     public abstract partial class ConfigurationProvider : Microsoft.Extensions.Configuration.IConfigurationProvider
     {
         protected ConfigurationProvider() { }
@@ -115,7 +115,7 @@ namespace Microsoft.Extensions.Configuration
     public abstract partial class StreamConfigurationSource : Microsoft.Extensions.Configuration.IConfigurationSource
     {
         protected StreamConfigurationSource() { }
-        [System.Diagnostics.CodeAnalysis.DisallowNull]
+        [System.Diagnostics.CodeAnalysis.DisallowNullAttribute]
         public System.IO.Stream? Stream { get { throw null; } set { } }
         public abstract Microsoft.Extensions.Configuration.IConfigurationProvider Build(Microsoft.Extensions.Configuration.IConfigurationBuilder builder);
     }
index 8cb0112..89aa77e 100644 (file)
@@ -66,7 +66,8 @@ namespace Microsoft.Extensions.Configuration
 
         IDictionary<string, object> IConfigurationBuilder.Properties => _properties;
 
-        IList<IConfigurationSource> IConfigurationBuilder.Sources => _sources;
+        /// <inheritdoc />
+        public IList<IConfigurationSource> Sources => _sources;
 
         // We cannot track the duration of the reference to the providers if this property is used.
         // If a configuration source is removed after this is accessed but before it's completely enumerated,
index 1a61a47..d4561ee 100644 (file)
@@ -1184,6 +1184,38 @@ namespace Microsoft.Extensions.Configuration.Test
             Assert.Same(config, ((IConfigurationBuilder)config).Build());
         }
 
+        [Fact]
+        public void ClearConfigurationSources()
+        {
+            // Arrange
+            var dic1 = new Dictionary<string, string>()
+            {
+                {"Mem1:KeyInMem1", "ValueInMem1"},
+            };
+            var dic2 = new Dictionary<string, string>()
+            {
+                {"Mem2:KeyInMem2", "ValueInMem2"},
+            };
+
+            var memConfigSrc1 = new MemoryConfigurationSource { InitialData = dic1 };
+            var memConfigSrc2 = new MemoryConfigurationSource { InitialData = dic2 };
+
+            var config = new ConfigurationManager();
+            IConfigurationBuilder configurationBuilder = config;
+
+            configurationBuilder.Add(memConfigSrc1);
+            configurationBuilder.Add(memConfigSrc2);
+
+            // Act
+            config.Sources.Clear();
+
+            // Assert
+            Assert.DoesNotContain(memConfigSrc1, config.Sources);
+            Assert.DoesNotContain(memConfigSrc2, config.Sources);
+            Assert.Null(config["Mem1:KeyInMem1"]);
+            Assert.Null(config["Mem2:KeyInMem2"]);
+        }
+
         private static string Get(IConfigurationProvider provider, string key)
         {
             string value;