diff --git a/src/Microsoft.FeatureManagement/FeatureManagementBuilder.cs b/src/Microsoft.FeatureManagement/FeatureManagementBuilder.cs index a433b2bc..55a0634a 100644 --- a/src/Microsoft.FeatureManagement/FeatureManagementBuilder.cs +++ b/src/Microsoft.FeatureManagement/FeatureManagementBuilder.cs @@ -37,7 +37,7 @@ public IFeatureManagementBuilder AddFeatureFilter() where T : IFeatureFilterM if (!Services.Any(descriptor => descriptor.ServiceType == serviceType && descriptor.ImplementationType == implementationType)) { - Services.AddSingleton(typeof(IFeatureFilterMetadata), typeof(T)); + Services.AddSingleton(serviceType, implementationType); } return this; diff --git a/src/Microsoft.FeatureManagement/FeatureManagementBuilderExtensions.cs b/src/Microsoft.FeatureManagement/FeatureManagementBuilderExtensions.cs new file mode 100644 index 00000000..58c4c834 --- /dev/null +++ b/src/Microsoft.FeatureManagement/FeatureManagementBuilderExtensions.cs @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. +// +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.FeatureManagement.FeatureFilters; + +namespace Microsoft.FeatureManagement +{ + /// + /// Extensions used to add feature management functionality. + /// + public static class FeatureManagementBuilderExtensions + { + /// + /// Adds an to be used for targeting and registers the targeting filter to the feature management system. + /// + /// The used to customize feature management functionality. + /// A that can be used to customize feature management functionality. + public static IFeatureManagementBuilder WithTargeting(this IFeatureManagementBuilder builder) where T : ITargetingContextAccessor + { + builder.Services.TryAddSingleton(typeof(ITargetingContextAccessor), typeof(T)); + + builder.AddFeatureFilter(); + + return builder; + } + } +} diff --git a/src/Microsoft.FeatureManagement/ServiceCollectionExtensions.cs b/src/Microsoft.FeatureManagement/ServiceCollectionExtensions.cs index 04cbb499..09307583 100644 --- a/src/Microsoft.FeatureManagement/ServiceCollectionExtensions.cs +++ b/src/Microsoft.FeatureManagement/ServiceCollectionExtensions.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Logging; +using Microsoft.FeatureManagement.FeatureFilters; using System; namespace Microsoft.FeatureManagement @@ -15,7 +16,7 @@ namespace Microsoft.FeatureManagement public static class ServiceCollectionExtensions { /// - /// Adds required feature management services. + /// Adds required feature management services and built-in feature filters. /// /// The service collection that feature management services are added to. /// A that can be used to customize feature management functionality. @@ -33,7 +34,17 @@ public static IFeatureManagementBuilder AddFeatureManagement(this IServiceCollec services.AddScoped(); - return new FeatureManagementBuilder(services); + var builder = new FeatureManagementBuilder(services); + + // + // Add built-in feature filters + builder.AddFeatureFilter(); + + builder.AddFeatureFilter(); + + builder.AddFeatureFilter(); + + return builder; } /// diff --git a/tests/Tests.FeatureManagement/FeatureManagement.cs b/tests/Tests.FeatureManagement/FeatureManagement.cs index 27c36c68..1272af0d 100644 --- a/tests/Tests.FeatureManagement/FeatureManagement.cs +++ b/tests/Tests.FeatureManagement/FeatureManagement.cs @@ -86,7 +86,7 @@ public async Task ReadsOnlyFeatureManagementSection() } [Fact] - public async Task AllowDuplicatedFilterAlias() + public async Task AllowsDuplicatedFilterAlias() { const string duplicatedFilterName = "DuplicatedFilterName"; @@ -101,8 +101,7 @@ public async Task AllowDuplicatedFilterAlias() .AddFeatureManagement() .AddFeatureFilter() .AddFeatureFilter() - .AddFeatureFilter() - .AddFeatureFilter(); + .AddFeatureFilter(); ServiceProvider serviceProvider = services.BuildServiceProvider(); @@ -127,8 +126,7 @@ public async Task AllowDuplicatedFilterAlias() services .AddSingleton(config) .AddFeatureManagement() - .AddFeatureFilter() - .AddFeatureFilter(); + .AddFeatureFilter(); serviceProvider = services.BuildServiceProvider(); @@ -142,8 +140,7 @@ public async Task AllowDuplicatedFilterAlias() .AddSingleton(config) .AddFeatureManagement() .AddFeatureFilter() - .AddFeatureFilter() - .AddFeatureFilter(); + .AddFeatureFilter(); serviceProvider = services.BuildServiceProvider(); @@ -163,8 +160,7 @@ public async Task AllowDuplicatedFilterAlias() .AddSingleton(config) .AddFeatureManagement() .AddFeatureFilter() - .AddFeatureFilter() - .AddFeatureFilter(); + .AddFeatureFilter(); serviceProvider = services.BuildServiceProvider(); @@ -183,8 +179,7 @@ public async Task AllowDuplicatedFilterAlias() services .AddSingleton(config) .AddFeatureManagement() - .AddFeatureFilter() - .AddFeatureFilter(); + .AddFeatureFilter(); serviceProvider = services.BuildServiceProvider(); @@ -246,8 +241,7 @@ public async Task TimeWindow() var serviceCollection = new ServiceCollection(); serviceCollection.AddSingleton(config) - .AddFeatureManagement() - .AddFeatureFilter(); + .AddFeatureManagement(); ServiceProvider provider = serviceCollection.BuildServiceProvider(); @@ -272,8 +266,7 @@ public async Task Percentage() var serviceCollection = new ServiceCollection(); serviceCollection.AddSingleton(config) - .AddFeatureManagement() - .AddFeatureFilter(); + .AddFeatureManagement(); ServiceProvider provider = serviceCollection.BuildServiceProvider(); @@ -307,8 +300,7 @@ public async Task Targeting() services .AddSingleton(config) - .AddFeatureManagement() - .AddFeatureFilter(); + .AddFeatureManagement(); ServiceProvider serviceProvider = services.BuildServiceProvider(); @@ -374,7 +366,7 @@ public async Task TargetingAccessor() services .AddSingleton(config) .AddFeatureManagement() - .AddFeatureFilter(); + .WithTargeting(); ServiceProvider serviceProvider = services.BuildServiceProvider();