Skip to content

Commit b6bade5

Browse files
Register built-in filter by default (#287)
* register built-in filter first & target on main branch * remove internal keyword * resolve comments * improve the way to register targeting context accessor * fix typo * adjust the way to register targeting context accessor & update testcases * fix typo * move WithTargeting to FeatureManagementBuilderExtension
1 parent ed3fce0 commit b6bade5

File tree

4 files changed

+52
-21
lines changed

4 files changed

+52
-21
lines changed

src/Microsoft.FeatureManagement/FeatureManagementBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public IFeatureManagementBuilder AddFeatureFilter<T>() where T : IFeatureFilterM
3737

3838
if (!Services.Any(descriptor => descriptor.ServiceType == serviceType && descriptor.ImplementationType == implementationType))
3939
{
40-
Services.AddSingleton(typeof(IFeatureFilterMetadata), typeof(T));
40+
Services.AddSingleton(serviceType, implementationType);
4141
}
4242

4343
return this;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT license.
3+
//
4+
using Microsoft.Extensions.DependencyInjection.Extensions;
5+
using Microsoft.FeatureManagement.FeatureFilters;
6+
7+
namespace Microsoft.FeatureManagement
8+
{
9+
/// <summary>
10+
/// Extensions used to add feature management functionality.
11+
/// </summary>
12+
public static class FeatureManagementBuilderExtensions
13+
{
14+
/// <summary>
15+
/// Adds an <see cref="ITargetingContextAccessor"/> to be used for targeting and registers the targeting filter to the feature management system.
16+
/// </summary>
17+
/// <param name="builder">The <see cref="IFeatureManagementBuilder"/> used to customize feature management functionality.</param>
18+
/// <returns>A <see cref="IFeatureManagementBuilder"/> that can be used to customize feature management functionality.</returns>
19+
public static IFeatureManagementBuilder WithTargeting<T>(this IFeatureManagementBuilder builder) where T : ITargetingContextAccessor
20+
{
21+
builder.Services.TryAddSingleton(typeof(ITargetingContextAccessor), typeof(T));
22+
23+
builder.AddFeatureFilter<TargetingFilter>();
24+
25+
return builder;
26+
}
27+
}
28+
}

src/Microsoft.FeatureManagement/ServiceCollectionExtensions.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Microsoft.Extensions.DependencyInjection;
66
using Microsoft.Extensions.DependencyInjection.Extensions;
77
using Microsoft.Extensions.Logging;
8+
using Microsoft.FeatureManagement.FeatureFilters;
89
using System;
910

1011
namespace Microsoft.FeatureManagement
@@ -15,7 +16,7 @@ namespace Microsoft.FeatureManagement
1516
public static class ServiceCollectionExtensions
1617
{
1718
/// <summary>
18-
/// Adds required feature management services.
19+
/// Adds required feature management services and built-in feature filters.
1920
/// </summary>
2021
/// <param name="services">The service collection that feature management services are added to.</param>
2122
/// <returns>A <see cref="IFeatureManagementBuilder"/> that can be used to customize feature management functionality.</returns>
@@ -33,7 +34,17 @@ public static IFeatureManagementBuilder AddFeatureManagement(this IServiceCollec
3334

3435
services.AddScoped<IFeatureManagerSnapshot, FeatureManagerSnapshot>();
3536

36-
return new FeatureManagementBuilder(services);
37+
var builder = new FeatureManagementBuilder(services);
38+
39+
//
40+
// Add built-in feature filters
41+
builder.AddFeatureFilter<PercentageFilter>();
42+
43+
builder.AddFeatureFilter<TimeWindowFilter>();
44+
45+
builder.AddFeatureFilter<ContextualTargetingFilter>();
46+
47+
return builder;
3748
}
3849

3950
/// <summary>

tests/Tests.FeatureManagement/FeatureManagement.cs

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public async Task ReadsOnlyFeatureManagementSection()
8686
}
8787

8888
[Fact]
89-
public async Task AllowDuplicatedFilterAlias()
89+
public async Task AllowsDuplicatedFilterAlias()
9090
{
9191
const string duplicatedFilterName = "DuplicatedFilterName";
9292

@@ -101,8 +101,7 @@ public async Task AllowDuplicatedFilterAlias()
101101
.AddFeatureManagement()
102102
.AddFeatureFilter<DuplicatedAliasFeatureFilter1>()
103103
.AddFeatureFilter<ContextualDuplicatedAliasFeatureFilterWithAccountContext>()
104-
.AddFeatureFilter<ContextualDuplicatedAliasFeatureFilterWithDummyContext1>()
105-
.AddFeatureFilter<PercentageFilter>();
104+
.AddFeatureFilter<ContextualDuplicatedAliasFeatureFilterWithDummyContext1>();
106105

107106
ServiceProvider serviceProvider = services.BuildServiceProvider();
108107

@@ -127,8 +126,7 @@ public async Task AllowDuplicatedFilterAlias()
127126
services
128127
.AddSingleton(config)
129128
.AddFeatureManagement()
130-
.AddFeatureFilter<DuplicatedAliasFeatureFilter1>()
131-
.AddFeatureFilter<PercentageFilter>();
129+
.AddFeatureFilter<DuplicatedAliasFeatureFilter1>();
132130

133131
serviceProvider = services.BuildServiceProvider();
134132

@@ -142,8 +140,7 @@ public async Task AllowDuplicatedFilterAlias()
142140
.AddSingleton(config)
143141
.AddFeatureManagement()
144142
.AddFeatureFilter<DuplicatedAliasFeatureFilter1>()
145-
.AddFeatureFilter<DuplicatedAliasFeatureFilter2>()
146-
.AddFeatureFilter<PercentageFilter>();
143+
.AddFeatureFilter<DuplicatedAliasFeatureFilter2>();
147144

148145
serviceProvider = services.BuildServiceProvider();
149146

@@ -163,8 +160,7 @@ public async Task AllowDuplicatedFilterAlias()
163160
.AddSingleton(config)
164161
.AddFeatureManagement()
165162
.AddFeatureFilter<ContextualDuplicatedAliasFeatureFilterWithDummyContext1>()
166-
.AddFeatureFilter<ContextualDuplicatedAliasFeatureFilterWithDummyContext2>()
167-
.AddFeatureFilter<PercentageFilter>();
163+
.AddFeatureFilter<ContextualDuplicatedAliasFeatureFilterWithDummyContext2>();
168164

169165
serviceProvider = services.BuildServiceProvider();
170166

@@ -183,8 +179,7 @@ public async Task AllowDuplicatedFilterAlias()
183179
services
184180
.AddSingleton(config)
185181
.AddFeatureManagement()
186-
.AddFeatureFilter<ContextualDuplicatedAliasFeatureFilterWithAccountContext>()
187-
.AddFeatureFilter<PercentageFilter>();
182+
.AddFeatureFilter<ContextualDuplicatedAliasFeatureFilterWithAccountContext>();
188183

189184
serviceProvider = services.BuildServiceProvider();
190185

@@ -246,8 +241,7 @@ public async Task TimeWindow()
246241
var serviceCollection = new ServiceCollection();
247242

248243
serviceCollection.AddSingleton(config)
249-
.AddFeatureManagement()
250-
.AddFeatureFilter<TimeWindowFilter>();
244+
.AddFeatureManagement();
251245

252246
ServiceProvider provider = serviceCollection.BuildServiceProvider();
253247

@@ -272,8 +266,7 @@ public async Task Percentage()
272266
var serviceCollection = new ServiceCollection();
273267

274268
serviceCollection.AddSingleton(config)
275-
.AddFeatureManagement()
276-
.AddFeatureFilter<PercentageFilter>();
269+
.AddFeatureManagement();
277270

278271
ServiceProvider provider = serviceCollection.BuildServiceProvider();
279272

@@ -307,8 +300,7 @@ public async Task Targeting()
307300

308301
services
309302
.AddSingleton(config)
310-
.AddFeatureManagement()
311-
.AddFeatureFilter<ContextualTargetingFilter>();
303+
.AddFeatureManagement();
312304

313305
ServiceProvider serviceProvider = services.BuildServiceProvider();
314306

@@ -374,7 +366,7 @@ public async Task TargetingAccessor()
374366
services
375367
.AddSingleton(config)
376368
.AddFeatureManagement()
377-
.AddFeatureFilter<TargetingFilter>();
369+
.WithTargeting<OnDemandTargetingContextAccessor>();
378370

379371
ServiceProvider serviceProvider = services.BuildServiceProvider();
380372

0 commit comments

Comments
 (0)