Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions src/OpenFeature.Hosting/OpenFeatureBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -223,16 +223,25 @@ internal static OpenFeatureBuilder AddPolicyBasedClient(this OpenFeatureBuilder
{
var policy = provider.GetRequiredService<IOptions<PolicyNameOptions>>().Value;
var name = policy.DefaultNameSelector(provider);
if (name == null)
{
return provider.GetRequiredService<IFeatureClient>();
}
return provider.GetRequiredKeyedService<IFeatureClient>(name);
return ResolveFeatureClient(provider, name);
});

return builder;
}

private static IFeatureClient ResolveFeatureClient(IServiceProvider provider, string? name = null)
{
var api = provider.GetRequiredService<Api>();
var client = api.GetClient(name);
var context = provider.GetService<EvaluationContext>();
if (context != null)
{
client.SetContext(context);
}

return client;
}

/// <summary>
/// Configures policy name options for OpenFeature using the specified options type.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -539,7 +539,7 @@ public void AddPolicyBasedClient_AddsScopedFeatureClient()
Assert.NotNull(client);
}

[Fact(Skip = "Bug due to https://github.com/open-feature/dotnet-sdk/issues/543")]
[Fact]
public void AddPolicyBasedClient_WithNoDefaultName_AddsScopedFeatureClient()
{
// Arrange
Expand All @@ -559,4 +559,34 @@ public void AddPolicyBasedClient_WithNoDefaultName_AddsScopedFeatureClient()
var client = scope.ServiceProvider.GetService<IFeatureClient>();
Assert.NotNull(client);
}

[Fact]
public void AddPolicyBasedClient_WithEvaluationContext()
{
// Arrange
_services.AddSingleton(sp => Api.Instance);

var context = EvaluationContext.Builder()
.Set("userId", "user-123")
.Build();

_services.AddTransient(_ => context);

_services.AddOptions<PolicyNameOptions>()
.Configure(options => options.DefaultNameSelector = _ => "default-name");

_systemUnderTest.AddProvider("default-name", (_, key) => new NoOpFeatureProvider());

// Act
_systemUnderTest.AddPolicyBasedClient();

// Assert
using var serviceProvider = _services.BuildServiceProvider();
using var scope = serviceProvider.CreateScope();
var client = scope.ServiceProvider.GetService<IFeatureClient>();
Assert.NotNull(client);

var actualContext = client.GetContext();
Assert.Equal(context, actualContext);
}
}