diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationExtensions.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationExtensions.cs index 8b4bf8c8..f8c2c5ca 100644 --- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationExtensions.cs +++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationExtensions.cs @@ -3,6 +3,7 @@ // using Microsoft.Extensions.Configuration.AzureAppConfiguration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using System; using System.Collections.Generic; using System.Security; @@ -99,11 +100,11 @@ public static IServiceCollection AddAzureAppConfiguration(this IServiceCollectio if (!_isProviderDisabled) { services.AddLogging(); - services.AddSingleton(); + services.TryAddSingleton(); } else { - services.AddSingleton(); + services.TryAddSingleton(); } return services; diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationRefresherProvider.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationRefresherProvider.cs index e86f6cc1..d2b31071 100644 --- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationRefresherProvider.cs +++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationRefresherProvider.cs @@ -13,11 +13,38 @@ internal class AzureAppConfigurationRefresherProvider : IConfigurationRefresherP { private static readonly PropertyInfo _propertyInfo = typeof(ChainedConfigurationProvider).GetProperty("Configuration", BindingFlags.Public | BindingFlags.Instance); - public IEnumerable Refreshers { get; } + private readonly IConfiguration _configuration; + private readonly ILoggerFactory _loggerFactory; + private IEnumerable _refreshers; + private bool _rediscoveredRefreshers = false; - public AzureAppConfigurationRefresherProvider(IConfiguration configuration, ILoggerFactory _loggerFactory) + public IEnumerable Refreshers { - var configurationRoot = configuration as IConfigurationRoot; + get + { + // Ensure latest refreshers are discovered if the configuration has changed since the constructor was called + if (!_rediscoveredRefreshers) + { + _refreshers = DiscoverRefreshers(); + + _rediscoveredRefreshers = true; + } + + return _refreshers; + } + } + + public AzureAppConfigurationRefresherProvider(IConfiguration configuration, ILoggerFactory loggerFactory) + { + _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); + _loggerFactory = loggerFactory; + + _refreshers = DiscoverRefreshers(); + } + + private IEnumerable DiscoverRefreshers() + { + var configurationRoot = _configuration as IConfigurationRoot; var refreshers = new List(); FindRefreshers(configurationRoot, _loggerFactory, refreshers); @@ -27,7 +54,7 @@ public AzureAppConfigurationRefresherProvider(IConfiguration configuration, ILog throw new InvalidOperationException("Unable to access the Azure App Configuration provider. Please ensure that it has been configured correctly."); } - Refreshers = refreshers; + return refreshers; } private void FindRefreshers(IConfigurationRoot configurationRoot, ILoggerFactory loggerFactory, List refreshers)