Skip to content

Commit 4b965dd

Browse files
fix: Ensure AddPolicyName without adding a Provider does not get stuck in infinite loop (#606)
* Fix issue when adding a DefaultNamePolicy * If you add a AddPolicyName without having previously added a Provider, the code will get stuck trying to resolve IFeatureClient Signed-off-by: Kyle Julian <[email protected]> * Address copilot comments and improve unit test coverage Signed-off-by: Kyle Julian <[email protected]> --------- Signed-off-by: Kyle Julian <[email protected]>
1 parent 1c6a684 commit 4b965dd

File tree

2 files changed

+45
-6
lines changed

2 files changed

+45
-6
lines changed

src/OpenFeature.Hosting/OpenFeatureBuilderExtensions.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,16 +223,25 @@ internal static OpenFeatureBuilder AddPolicyBasedClient(this OpenFeatureBuilder
223223
{
224224
var policy = provider.GetRequiredService<IOptions<PolicyNameOptions>>().Value;
225225
var name = policy.DefaultNameSelector(provider);
226-
if (name == null)
227-
{
228-
return provider.GetRequiredService<IFeatureClient>();
229-
}
230-
return provider.GetRequiredKeyedService<IFeatureClient>(name);
226+
return ResolveFeatureClient(provider, name);
231227
});
232228

233229
return builder;
234230
}
235231

232+
private static IFeatureClient ResolveFeatureClient(IServiceProvider provider, string? name = null)
233+
{
234+
var api = provider.GetRequiredService<Api>();
235+
var client = api.GetClient(name);
236+
var context = provider.GetService<EvaluationContext>();
237+
if (context != null)
238+
{
239+
client.SetContext(context);
240+
}
241+
242+
return client;
243+
}
244+
236245
/// <summary>
237246
/// Configures policy name options for OpenFeature using the specified options type.
238247
/// </summary>

test/OpenFeature.Hosting.Tests/OpenFeatureBuilderExtensionsTests.cs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,7 @@ public void AddPolicyBasedClient_AddsScopedFeatureClient()
539539
Assert.NotNull(client);
540540
}
541541

542-
[Fact(Skip = "Bug due to https://github.com/open-feature/dotnet-sdk/issues/543")]
542+
[Fact]
543543
public void AddPolicyBasedClient_WithNoDefaultName_AddsScopedFeatureClient()
544544
{
545545
// Arrange
@@ -559,4 +559,34 @@ public void AddPolicyBasedClient_WithNoDefaultName_AddsScopedFeatureClient()
559559
var client = scope.ServiceProvider.GetService<IFeatureClient>();
560560
Assert.NotNull(client);
561561
}
562+
563+
[Fact]
564+
public void AddPolicyBasedClient_WithEvaluationContext()
565+
{
566+
// Arrange
567+
_services.AddSingleton(sp => Api.Instance);
568+
569+
var context = EvaluationContext.Builder()
570+
.Set("userId", "user-123")
571+
.Build();
572+
573+
_services.AddTransient(_ => context);
574+
575+
_services.AddOptions<PolicyNameOptions>()
576+
.Configure(options => options.DefaultNameSelector = _ => "default-name");
577+
578+
_systemUnderTest.AddProvider("default-name", (_, key) => new NoOpFeatureProvider());
579+
580+
// Act
581+
_systemUnderTest.AddPolicyBasedClient();
582+
583+
// Assert
584+
using var serviceProvider = _services.BuildServiceProvider();
585+
using var scope = serviceProvider.CreateScope();
586+
var client = scope.ServiceProvider.GetService<IFeatureClient>();
587+
Assert.NotNull(client);
588+
589+
var actualContext = client.GetContext();
590+
Assert.Equal(context, actualContext);
591+
}
562592
}

0 commit comments

Comments
 (0)