@@ -24,9 +24,10 @@ public sealed class ConfigurationFeatureDefinitionProvider : IFeatureDefinitionP
2424 // provider to be marked for caching as well.
2525
2626 private readonly IConfiguration _configuration ;
27- private readonly ConcurrentDictionary < string , FeatureDefinition > _definitions ;
27+ private readonly ConcurrentDictionary < string , Task < FeatureDefinition > > _definitions ;
2828 private IDisposable _changeSubscription ;
2929 private int _stale = 0 ;
30+ private Func < string , Task < FeatureDefinition > > _getFeatureDefinitionFunc ;
3031
3132 const string ParseValueErrorString = "Invalid setting '{0}' with value '{1}' for feature '{2}'." ;
3233
@@ -37,11 +38,16 @@ public sealed class ConfigurationFeatureDefinitionProvider : IFeatureDefinitionP
3738 public ConfigurationFeatureDefinitionProvider ( IConfiguration configuration )
3839 {
3940 _configuration = configuration ?? throw new ArgumentNullException ( nameof ( configuration ) ) ;
40- _definitions = new ConcurrentDictionary < string , FeatureDefinition > ( ) ;
41+ _definitions = new ConcurrentDictionary < string , Task < FeatureDefinition > > ( ) ;
4142
4243 _changeSubscription = ChangeToken . OnChange (
4344 ( ) => _configuration . GetReloadToken ( ) ,
4445 ( ) => _stale = 1 ) ;
46+
47+ _getFeatureDefinitionFunc = ( featureName ) =>
48+ {
49+ return Task . FromResult ( GetMicrosoftSchemaFeatureDefinition ( featureName ) ?? GetDotnetSchemaFeatureDefinition ( featureName ) ) ;
50+ } ;
4551 }
4652
4753 /// <summary>
@@ -86,10 +92,7 @@ public Task<FeatureDefinition> GetFeatureDefinitionAsync(string featureName)
8692 _definitions . Clear ( ) ;
8793 }
8894
89- return Task . FromResult (
90- _definitions . GetOrAdd (
91- featureName ,
92- ( _ ) => GetMicrosoftSchemaFeatureDefinition ( featureName ) ?? GetDotnetSchemaFeatureDefinition ( featureName ) ) ) ;
95+ return _definitions . GetOrAdd ( featureName , _getFeatureDefinitionFunc ) ;
9396 }
9497
9598 /// <summary>
@@ -98,7 +101,7 @@ public Task<FeatureDefinition> GetFeatureDefinitionAsync(string featureName)
98101 /// <returns>An enumerator which provides asynchronous iteration over feature definitions.</returns>
99102 //
100103 // 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.
102105#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
103106 public async IAsyncEnumerable < FeatureDefinition > GetAllFeatureDefinitionsAsync ( )
104107#pragma warning restore CS1998
@@ -121,7 +124,7 @@ public async IAsyncEnumerable<FeatureDefinition> GetAllFeatureDefinitionsAsync()
121124
122125 //
123126 // 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 ;
125128
126129 if ( definition != null )
127130 {
@@ -142,7 +145,7 @@ public async IAsyncEnumerable<FeatureDefinition> GetAllFeatureDefinitionsAsync()
142145
143146 //
144147 // 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 ;
146149
147150 if ( definition != null )
148151 {
@@ -155,32 +158,32 @@ private FeatureDefinition GetDotnetSchemaFeatureDefinition(string featureName)
155158 {
156159 IEnumerable < IConfigurationSection > dotnetFeatureDefinitionSections = GetDotnetFeatureDefinitionSections ( ) ;
157160
158- IConfigurationSection configuration = dotnetFeatureDefinitionSections
161+ IConfigurationSection dotnetFeatureDefinitionConfiguration = dotnetFeatureDefinitionSections
159162 . FirstOrDefault ( section =>
160163 string . Equals ( section . Key , featureName , StringComparison . OrdinalIgnoreCase ) ) ;
161164
162- if ( configuration == null )
165+ if ( dotnetFeatureDefinitionConfiguration == null )
163166 {
164167 return null ;
165168 }
166169
167- return ParseDotnetSchemaFeatureDefinition ( configuration ) ;
170+ return ParseDotnetSchemaFeatureDefinition ( dotnetFeatureDefinitionConfiguration ) ;
168171 }
169172
170173 private FeatureDefinition GetMicrosoftSchemaFeatureDefinition ( string featureName )
171174 {
172175 IEnumerable < IConfigurationSection > microsoftFeatureDefinitionSections = GetMicrosoftFeatureDefinitionSections ( ) ;
173176
174- IConfigurationSection configuration = microsoftFeatureDefinitionSections
177+ IConfigurationSection microsoftFeatureDefinitionConfiguration = microsoftFeatureDefinitionSections
175178 . LastOrDefault ( section =>
176179 string . Equals ( section [ MicrosoftFeatureManagementFields . Id ] , featureName , StringComparison . OrdinalIgnoreCase ) ) ;
177180
178- if ( configuration == null )
181+ if ( microsoftFeatureDefinitionConfiguration == null )
179182 {
180183 return null ;
181184 }
182185
183- return ParseMicrosoftSchemaFeatureDefinition ( configuration ) ;
186+ return ParseMicrosoftSchemaFeatureDefinition ( microsoftFeatureDefinitionConfiguration ) ;
184187 }
185188
186189 private IEnumerable < IConfigurationSection > GetDotnetFeatureDefinitionSections ( )
@@ -518,7 +521,7 @@ private FeatureDefinition ParseMicrosoftSchemaFeatureDefinition(IConfigurationSe
518521 } ;
519522 }
520523
521- private T ParseEnum < T > ( string feature , string rawValue , string fieldKeyword )
524+ private static T ParseEnum < T > ( string feature , string rawValue , string fieldKeyword )
522525 where T : struct , Enum
523526 {
524527 Debug . Assert ( ! string . IsNullOrEmpty ( rawValue ) ) ;
@@ -533,7 +536,7 @@ private T ParseEnum<T>(string feature, string rawValue, string fieldKeyword)
533536 return value ;
534537 }
535538
536- private double ParseDouble ( string feature , string rawValue , string fieldKeyword )
539+ private static double ParseDouble ( string feature , string rawValue , string fieldKeyword )
537540 {
538541 Debug . Assert ( ! string . IsNullOrEmpty ( rawValue ) ) ;
539542
@@ -547,7 +550,7 @@ private double ParseDouble(string feature, string rawValue, string fieldKeyword)
547550 return value ;
548551 }
549552
550- private bool ParseBool ( string feature , string rawValue , string fieldKeyword )
553+ private static bool ParseBool ( string feature , string rawValue , string fieldKeyword )
551554 {
552555 Debug . Assert ( ! string . IsNullOrEmpty ( rawValue ) ) ;
553556
0 commit comments