diff --git a/src/Microsoft.FeatureManagement/FeatureManager.cs b/src/Microsoft.FeatureManagement/FeatureManager.cs
index ef850a03..7730fa92 100644
--- a/src/Microsoft.FeatureManagement/FeatureManager.cs
+++ b/src/Microsoft.FeatureManagement/FeatureManager.cs
@@ -39,17 +39,21 @@ private class ConfigurationCacheItem
///
/// The provider of feature flag definitions.
/// Options controlling the behavior of the feature manager.
+ /// The collection of feature filter metadata.
+ /// The collection of session managers.
/// Thrown if is null.
public FeatureManager(
IFeatureDefinitionProvider featureDefinitionProvider,
- FeatureManagementOptions options = null)
+ FeatureManagementOptions options = null,
+ IEnumerable featureFilters = null,
+ IEnumerable sessionManagers = null)
{
_filterMetadataCache = new ConcurrentDictionary();
_contextualFeatureFilterCache = new ConcurrentDictionary();
_featureDefinitionProvider = featureDefinitionProvider ?? throw new ArgumentNullException(nameof(featureDefinitionProvider));
_options = options ?? new FeatureManagementOptions();
- _featureFilters = Enumerable.Empty();
- _sessionManagers = Enumerable.Empty();
+ _featureFilters = featureFilters ?? Enumerable.Empty();
+ _sessionManagers = sessionManagers ?? Enumerable.Empty();
}
///
diff --git a/tests/Tests.FeatureManagement/FeatureManagement.cs b/tests/Tests.FeatureManagement/FeatureManagement.cs
index e5c0ba06..54758614 100644
--- a/tests/Tests.FeatureManagement/FeatureManagement.cs
+++ b/tests/Tests.FeatureManagement/FeatureManagement.cs
@@ -1027,5 +1027,41 @@ public async Task BindsFeatureFlagSettings()
Assert.True(called);
}
+
+ [Fact]
+ public void ConstructorUsesFallbackValues()
+ {
+ var config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
+ var configDefinitionProvider = new ConfigurationFeatureDefinitionProvider(config);
+ var featureManager = new FeatureManager(configDefinitionProvider);
+
+ Assert.Empty(featureManager.FeatureFilters);
+ Assert.Empty(featureManager.SessionManagers);
+ }
+
+ [Fact]
+ public void ConstructorSetsOptionalValues()
+ {
+ var config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
+ var configDefinitionProvider = new ConfigurationFeatureDefinitionProvider(config);
+ var options = new FeatureManagementOptions();
+ var featureFilters = new List
+ {
+ new TestFilter()
+ };
+ var sessionManagers = new List
+ {
+ new TestSessionManager()
+ };
+ var featureManager = new FeatureManager(
+ configDefinitionProvider,
+ options,
+ featureFilters,
+ sessionManagers
+ );
+
+ Assert.Single(featureManager.FeatureFilters);
+ Assert.Single(featureManager.SessionManagers);
+ }
}
}
diff --git a/tests/Tests.FeatureManagement/TestSessionManager.cs b/tests/Tests.FeatureManagement/TestSessionManager.cs
new file mode 100644
index 00000000..59b6b0d1
--- /dev/null
+++ b/tests/Tests.FeatureManagement/TestSessionManager.cs
@@ -0,0 +1,25 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Microsoft.FeatureManagement;
+
+namespace Tests.FeatureManagement
+{
+ class TestSessionManager : ISessionManager
+ {
+ private readonly IDictionary _features = new Dictionary();
+
+ public Task SetAsync(string featureName, bool enabled)
+ {
+ _features[featureName] = enabled;
+
+ return Task.CompletedTask;
+ }
+
+ public Task GetAsync(string featureName)
+ {
+ bool? result = _features.TryGetValue(featureName, out var feature) ? feature : null;
+
+ return Task.FromResult(result);
+ }
+ }
+}
\ No newline at end of file