diff --git a/src/Microsoft.FeatureManagement/ConfigurationDynamicFeatureDefinitionProvider.cs b/src/Microsoft.FeatureManagement/ConfigurationDynamicFeatureDefinitionProvider.cs index 82794ef6..4c50702e 100644 --- a/src/Microsoft.FeatureManagement/ConfigurationDynamicFeatureDefinitionProvider.cs +++ b/src/Microsoft.FeatureManagement/ConfigurationDynamicFeatureDefinitionProvider.cs @@ -19,8 +19,8 @@ namespace Microsoft.FeatureManagement /// sealed class ConfigurationDynamicFeatureDefinitionProvider : IDynamicFeatureDefinitionProvider, IDisposable { + public const string DynamicFeatureDefinitionsSectionName = "DynamicFeatures"; private const string FeatureManagementSectionName = "FeatureManagement"; - private const string DynamicFeatureDefinitionsSectionName= "DynamicFeatures"; private const string FeatureVariantsSectionName = "Variants"; private readonly IConfiguration _configuration; private readonly ConcurrentDictionary _dynamicFeatureDefinitions; diff --git a/src/Microsoft.FeatureManagement/ConfigurationFeatureFlagDefinitionProvider.cs b/src/Microsoft.FeatureManagement/ConfigurationFeatureFlagDefinitionProvider.cs index d302cff2..e3aea38d 100644 --- a/src/Microsoft.FeatureManagement/ConfigurationFeatureFlagDefinitionProvider.cs +++ b/src/Microsoft.FeatureManagement/ConfigurationFeatureFlagDefinitionProvider.cs @@ -186,6 +186,18 @@ private IEnumerable GetFeatureFlagDefinitionSections() IConfigurationSection featureFlagsSection = featureManagementChildren.FirstOrDefault(s => s.Key == FeatureFlagDefinitionsSectionName); + // + // Check for mixed schema to avoid confusing scenario where feature flags defined in separate sources with different schemas don't mix. + if (featureFlagsSection != null && + featureManagementChildren.Any(section => + !section.Key.Equals(FeatureFlagDefinitionsSectionName) && + !section.Key.Equals(ConfigurationDynamicFeatureDefinitionProvider.DynamicFeatureDefinitionsSectionName))) + { + throw new FeatureManagementException( + FeatureManagementError.InvalidConfiguration, + "Detected feature flags defined using different feature management schemas."); + } + // // Support backward compatability where feature flag definitions were directly under the feature management section return featureFlagsSection == null ? diff --git a/src/Microsoft.FeatureManagement/FeatureManagementError.cs b/src/Microsoft.FeatureManagement/FeatureManagementError.cs index 8eb6208a..a8deb232 100644 --- a/src/Microsoft.FeatureManagement/FeatureManagementError.cs +++ b/src/Microsoft.FeatureManagement/FeatureManagementError.cs @@ -61,6 +61,11 @@ public enum FeatureManagementError /// /// A dynamic feature does not have a default feature variant configured. /// - MissingDefaultFeatureVariant + MissingDefaultFeatureVariant, + + /// + /// A configuration error is present in the feature management system. + /// + InvalidConfiguration } }