@@ -24,9 +24,10 @@ public sealed class ConfigurationFeatureDefinitionProvider : IFeatureDefinitionP
24
24
// provider to be marked for caching as well.
25
25
26
26
private readonly IConfiguration _configuration ;
27
- private readonly ConcurrentDictionary < string , FeatureDefinition > _definitions ;
27
+ private readonly ConcurrentDictionary < string , Task < FeatureDefinition > > _definitions ;
28
28
private IDisposable _changeSubscription ;
29
29
private int _stale = 0 ;
30
+ private readonly Func < string , Task < FeatureDefinition > > _getFeatureDefinitionFunc ;
30
31
31
32
const string ParseValueErrorString = "Invalid setting '{0}' with value '{1}' for feature '{2}'." ;
32
33
@@ -37,11 +38,16 @@ public sealed class ConfigurationFeatureDefinitionProvider : IFeatureDefinitionP
37
38
public ConfigurationFeatureDefinitionProvider ( IConfiguration configuration )
38
39
{
39
40
_configuration = configuration ?? throw new ArgumentNullException ( nameof ( configuration ) ) ;
40
- _definitions = new ConcurrentDictionary < string , FeatureDefinition > ( ) ;
41
+ _definitions = new ConcurrentDictionary < string , Task < FeatureDefinition > > ( ) ;
41
42
42
43
_changeSubscription = ChangeToken . OnChange (
43
44
( ) => _configuration . GetReloadToken ( ) ,
44
45
( ) => _stale = 1 ) ;
46
+
47
+ _getFeatureDefinitionFunc = ( featureName ) =>
48
+ {
49
+ return Task . FromResult ( GetMicrosoftSchemaFeatureDefinition ( featureName ) ?? GetDotnetSchemaFeatureDefinition ( featureName ) ) ;
50
+ } ;
45
51
}
46
52
47
53
/// <summary>
@@ -86,10 +92,7 @@ public Task<FeatureDefinition> GetFeatureDefinitionAsync(string featureName)
86
92
_definitions . Clear ( ) ;
87
93
}
88
94
89
- return Task . FromResult (
90
- _definitions . GetOrAdd (
91
- featureName ,
92
- ( _ ) => GetMicrosoftSchemaFeatureDefinition ( featureName ) ?? GetDotnetSchemaFeatureDefinition ( featureName ) ) ) ;
95
+ return _definitions . GetOrAdd ( featureName , _getFeatureDefinitionFunc ) ;
93
96
}
94
97
95
98
/// <summary>
@@ -98,7 +101,7 @@ public Task<FeatureDefinition> GetFeatureDefinitionAsync(string featureName)
98
101
/// <returns>An enumerator which provides asynchronous iteration over feature definitions.</returns>
99
102
//
100
103
// The async key word is necessary for creating IAsyncEnumerable.
101
- // The need to disable this warning occurs when implementaing async stream synchronously.
104
+ // The need to disable this warning occurs when implementing async stream synchronously.
102
105
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
103
106
public async IAsyncEnumerable < FeatureDefinition > GetAllFeatureDefinitionsAsync ( )
104
107
#pragma warning restore CS1998
@@ -121,7 +124,7 @@ public async IAsyncEnumerable<FeatureDefinition> GetAllFeatureDefinitionsAsync()
121
124
122
125
//
123
126
// Underlying IConfigurationSection data is dynamic so latest feature definitions are returned
124
- FeatureDefinition definition = _definitions . GetOrAdd ( featureName , ( _ ) => ParseMicrosoftSchemaFeatureDefinition ( featureSection ) ) ;
127
+ FeatureDefinition definition = _definitions . GetOrAdd ( featureName , _getFeatureDefinitionFunc ) . Result ;
125
128
126
129
if ( definition != null )
127
130
{
@@ -142,7 +145,7 @@ public async IAsyncEnumerable<FeatureDefinition> GetAllFeatureDefinitionsAsync()
142
145
143
146
//
144
147
// Underlying IConfigurationSection data is dynamic so latest feature definitions are returned
145
- FeatureDefinition definition = _definitions . GetOrAdd ( featureName , ( _ ) => ParseDotnetSchemaFeatureDefinition ( featureSection ) ) ;
148
+ FeatureDefinition definition = _definitions . GetOrAdd ( featureName , _getFeatureDefinitionFunc ) . Result ;
146
149
147
150
if ( definition != null )
148
151
{
@@ -155,32 +158,32 @@ private FeatureDefinition GetDotnetSchemaFeatureDefinition(string featureName)
155
158
{
156
159
IEnumerable < IConfigurationSection > dotnetFeatureDefinitionSections = GetDotnetFeatureDefinitionSections ( ) ;
157
160
158
- IConfigurationSection configuration = dotnetFeatureDefinitionSections
161
+ IConfigurationSection dotnetFeatureDefinitionConfiguration = dotnetFeatureDefinitionSections
159
162
. FirstOrDefault ( section =>
160
163
string . Equals ( section . Key , featureName , StringComparison . OrdinalIgnoreCase ) ) ;
161
164
162
- if ( configuration == null )
165
+ if ( dotnetFeatureDefinitionConfiguration == null )
163
166
{
164
167
return null ;
165
168
}
166
169
167
- return ParseDotnetSchemaFeatureDefinition ( configuration ) ;
170
+ return ParseDotnetSchemaFeatureDefinition ( dotnetFeatureDefinitionConfiguration ) ;
168
171
}
169
172
170
173
private FeatureDefinition GetMicrosoftSchemaFeatureDefinition ( string featureName )
171
174
{
172
175
IEnumerable < IConfigurationSection > microsoftFeatureDefinitionSections = GetMicrosoftFeatureDefinitionSections ( ) ;
173
176
174
- IConfigurationSection configuration = microsoftFeatureDefinitionSections
177
+ IConfigurationSection microsoftFeatureDefinitionConfiguration = microsoftFeatureDefinitionSections
175
178
. LastOrDefault ( section =>
176
179
string . Equals ( section [ MicrosoftFeatureManagementFields . Id ] , featureName , StringComparison . OrdinalIgnoreCase ) ) ;
177
180
178
- if ( configuration == null )
181
+ if ( microsoftFeatureDefinitionConfiguration == null )
179
182
{
180
183
return null ;
181
184
}
182
185
183
- return ParseMicrosoftSchemaFeatureDefinition ( configuration ) ;
186
+ return ParseMicrosoftSchemaFeatureDefinition ( microsoftFeatureDefinitionConfiguration ) ;
184
187
}
185
188
186
189
private IEnumerable < IConfigurationSection > GetDotnetFeatureDefinitionSections ( )
@@ -518,7 +521,7 @@ private FeatureDefinition ParseMicrosoftSchemaFeatureDefinition(IConfigurationSe
518
521
} ;
519
522
}
520
523
521
- private T ParseEnum < T > ( string feature , string rawValue , string fieldKeyword )
524
+ private static T ParseEnum < T > ( string feature , string rawValue , string fieldKeyword )
522
525
where T : struct , Enum
523
526
{
524
527
Debug . Assert ( ! string . IsNullOrEmpty ( rawValue ) ) ;
@@ -533,7 +536,7 @@ private T ParseEnum<T>(string feature, string rawValue, string fieldKeyword)
533
536
return value ;
534
537
}
535
538
536
- private double ParseDouble ( string feature , string rawValue , string fieldKeyword )
539
+ private static double ParseDouble ( string feature , string rawValue , string fieldKeyword )
537
540
{
538
541
Debug . Assert ( ! string . IsNullOrEmpty ( rawValue ) ) ;
539
542
@@ -547,7 +550,7 @@ private double ParseDouble(string feature, string rawValue, string fieldKeyword)
547
550
return value ;
548
551
}
549
552
550
- private bool ParseBool ( string feature , string rawValue , string fieldKeyword )
553
+ private static bool ParseBool ( string feature , string rawValue , string fieldKeyword )
551
554
{
552
555
Debug . Assert ( ! string . IsNullOrEmpty ( rawValue ) ) ;
553
556
0 commit comments