diff --git a/src/libraries/Microsoft.Extensions.Configuration/ref/Microsoft.Extensions.Configuration.cs b/src/libraries/Microsoft.Extensions.Configuration/ref/Microsoft.Extensions.Configuration.cs index 98717cb091a5f5..b5c18ee34b897c 100644 --- a/src/libraries/Microsoft.Extensions.Configuration/ref/Microsoft.Extensions.Configuration.cs +++ b/src/libraries/Microsoft.Extensions.Configuration/ref/Microsoft.Extensions.Configuration.cs @@ -14,6 +14,7 @@ public static partial class ChainedBuilderExtensions public partial class ChainedConfigurationProvider : Microsoft.Extensions.Configuration.IConfigurationProvider, System.IDisposable { public ChainedConfigurationProvider(Microsoft.Extensions.Configuration.ChainedConfigurationSource source) { } + public Microsoft.Extensions.Configuration.IConfiguration Configuration { get { throw null; } } public void Dispose() { } public System.Collections.Generic.IEnumerable GetChildKeys(System.Collections.Generic.IEnumerable earlierKeys, string? parentPath) { throw null; } public Microsoft.Extensions.Primitives.IChangeToken GetReloadToken() { throw null; } diff --git a/src/libraries/Microsoft.Extensions.Configuration/src/ChainedConfigurationProvider.cs b/src/libraries/Microsoft.Extensions.Configuration/src/ChainedConfigurationProvider.cs index f0a9380a6656e2..c5d46497155e8d 100644 --- a/src/libraries/Microsoft.Extensions.Configuration/src/ChainedConfigurationProvider.cs +++ b/src/libraries/Microsoft.Extensions.Configuration/src/ChainedConfigurationProvider.cs @@ -21,15 +21,15 @@ public class ChainedConfigurationProvider : IConfigurationProvider, IDisposable /// The source configuration. public ChainedConfigurationProvider(ChainedConfigurationSource source!!) { - if (source.Configuration == null) - { - throw new ArgumentException(SR.Format(SR.InvalidNullArgument, "source.Configuration"), nameof(source)); - } - - _config = source.Configuration; + _config = source.Configuration ?? throw new ArgumentException(SR.Format(SR.InvalidNullArgument, "source.Configuration"), nameof(source)); _shouldDisposeConfig = source.ShouldDisposeConfiguration; } + /// + /// Gets the chained configuration. + /// + public IConfiguration Configuration => _config; + /// /// Tries to get a configuration value for the specified key. /// diff --git a/src/libraries/Microsoft.Extensions.Configuration/tests/ChainedConfigurationProviderTests.cs b/src/libraries/Microsoft.Extensions.Configuration/tests/ChainedConfigurationProviderTests.cs new file mode 100644 index 00000000000000..b18da67bd69a69 --- /dev/null +++ b/src/libraries/Microsoft.Extensions.Configuration/tests/ChainedConfigurationProviderTests.cs @@ -0,0 +1,63 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using System.Linq; +using Microsoft.Extensions.Configuration.Memory; +using Xunit; + +namespace Microsoft.Extensions.Configuration.Test +{ + public class ChainedConfigurationProvierTests + { + [Fact] + public void ChainedConfiguration_UsingMemoryConfigurationSource_ChainedCouldExposeProvider() + { + var chainedConfigurationProvider = new ChainedConfigurationSource + { + Configuration = new ConfigurationBuilder() + .Add(new MemoryConfigurationSource { + InitialData = new Dictionary() { { "a:b", "c" } } + }) + .Build(), + ShouldDisposeConfiguration = false, + } + .Build(new ConfigurationBuilder()) as ChainedConfigurationProvider; + + Assert.True(chainedConfigurationProvider.TryGet("a:b", out string? value)); + Assert.Equal("c", value); + Assert.Equal("c", chainedConfigurationProvider.Configuration["a:b"]); + + var configRoot = chainedConfigurationProvider.Configuration as IConfigurationRoot; + Assert.NotNull(configRoot); + Assert.Equal(1, configRoot.Providers.Count()); + Assert.IsType(configRoot.Providers.First()); + } + + [Fact] + public void ChainedConfiguration_ExposesProvider() + { + var providers = new IConfigurationProvider[] { + new TestConfigurationProvider("foo", "foo-value") + }; + var chainedConfigurationSource = new ChainedConfigurationSource + { + Configuration = new ConfigurationRoot(providers), + ShouldDisposeConfiguration = false, + }; + + var chainedConfigurationProvider = chainedConfigurationSource + .Build(new ConfigurationBuilder()) as ChainedConfigurationProvider; + + var configRoot = chainedConfigurationProvider.Configuration as IConfigurationRoot; + Assert.NotNull(configRoot); + Assert.Equal(providers, configRoot.Providers); + } + + private class TestConfigurationProvider : ConfigurationProvider + { + public TestConfigurationProvider(string key, string value) + => Data.Add(key, value); + } + } +} diff --git a/src/libraries/Microsoft.Extensions.Configuration/tests/ConfigurationManagerTest.cs b/src/libraries/Microsoft.Extensions.Configuration/tests/ConfigurationManagerTest.cs index d4561ee4889e65..7f2ca2877a48f8 100644 --- a/src/libraries/Microsoft.Extensions.Configuration/tests/ConfigurationManagerTest.cs +++ b/src/libraries/Microsoft.Extensions.Configuration/tests/ConfigurationManagerTest.cs @@ -221,7 +221,7 @@ public async Task ProviderDisposeDelayedWaitingOnConcurrentRead(Action concurrentReadAction(config)); await provider.ReadStartedTask;