Skip to content

Commit 2de6c93

Browse files
Use TryAddSingleton instead of AddSingleton for extension (#643)
* use TryAddSingleton instead of AddSingleton in extension, fix refresherprovider accordingly * remove unused using * add comment
1 parent 87f0f85 commit 2de6c93

File tree

2 files changed

+34
-6
lines changed

2 files changed

+34
-6
lines changed

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationExtensions.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
//
44
using Microsoft.Extensions.Configuration.AzureAppConfiguration;
55
using Microsoft.Extensions.DependencyInjection;
6+
using Microsoft.Extensions.DependencyInjection.Extensions;
67
using System;
78
using System.Collections.Generic;
89
using System.Security;
@@ -99,11 +100,11 @@ public static IServiceCollection AddAzureAppConfiguration(this IServiceCollectio
99100
if (!_isProviderDisabled)
100101
{
101102
services.AddLogging();
102-
services.AddSingleton<IConfigurationRefresherProvider, AzureAppConfigurationRefresherProvider>();
103+
services.TryAddSingleton<IConfigurationRefresherProvider, AzureAppConfigurationRefresherProvider>();
103104
}
104105
else
105106
{
106-
services.AddSingleton<IConfigurationRefresherProvider, EmptyConfigurationRefresherProvider>();
107+
services.TryAddSingleton<IConfigurationRefresherProvider, EmptyConfigurationRefresherProvider>();
107108
}
108109

109110
return services;

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationRefresherProvider.cs

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,38 @@ internal class AzureAppConfigurationRefresherProvider : IConfigurationRefresherP
1313
{
1414
private static readonly PropertyInfo _propertyInfo = typeof(ChainedConfigurationProvider).GetProperty("Configuration", BindingFlags.Public | BindingFlags.Instance);
1515

16-
public IEnumerable<IConfigurationRefresher> Refreshers { get; }
16+
private readonly IConfiguration _configuration;
17+
private readonly ILoggerFactory _loggerFactory;
18+
private IEnumerable<IConfigurationRefresher> _refreshers;
19+
private bool _rediscoveredRefreshers = false;
1720

18-
public AzureAppConfigurationRefresherProvider(IConfiguration configuration, ILoggerFactory _loggerFactory)
21+
public IEnumerable<IConfigurationRefresher> Refreshers
1922
{
20-
var configurationRoot = configuration as IConfigurationRoot;
23+
get
24+
{
25+
// Ensure latest refreshers are discovered if the configuration has changed since the constructor was called
26+
if (!_rediscoveredRefreshers)
27+
{
28+
_refreshers = DiscoverRefreshers();
29+
30+
_rediscoveredRefreshers = true;
31+
}
32+
33+
return _refreshers;
34+
}
35+
}
36+
37+
public AzureAppConfigurationRefresherProvider(IConfiguration configuration, ILoggerFactory loggerFactory)
38+
{
39+
_configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
40+
_loggerFactory = loggerFactory;
41+
42+
_refreshers = DiscoverRefreshers();
43+
}
44+
45+
private IEnumerable<IConfigurationRefresher> DiscoverRefreshers()
46+
{
47+
var configurationRoot = _configuration as IConfigurationRoot;
2148
var refreshers = new List<IConfigurationRefresher>();
2249

2350
FindRefreshers(configurationRoot, _loggerFactory, refreshers);
@@ -27,7 +54,7 @@ public AzureAppConfigurationRefresherProvider(IConfiguration configuration, ILog
2754
throw new InvalidOperationException("Unable to access the Azure App Configuration provider. Please ensure that it has been configured correctly.");
2855
}
2956

30-
Refreshers = refreshers;
57+
return refreshers;
3158
}
3259

3360
private void FindRefreshers(IConfigurationRoot configurationRoot, ILoggerFactory loggerFactory, List<IConfigurationRefresher> refreshers)

0 commit comments

Comments
 (0)