Skip to content

Commit c987b58

Browse files
fix: Ensure EvaluationContext is reliably added to the injected FeatureClient (#605)
* Fix issue when adding evaluation context after adding the provider Signed-off-by: Kyle Julian <[email protected]> * Tweak test to make sure it confirms the fix is applied Signed-off-by: Kyle Julian <[email protected]> * Restore IsContextConfigured and following unit test assertions * Removing this was technically a breaking change Signed-off-by: Kyle Julian <[email protected]> --------- Signed-off-by: Kyle Julian <[email protected]>
1 parent 4b965dd commit c987b58

File tree

2 files changed

+45
-32
lines changed

2 files changed

+45
-32
lines changed

src/OpenFeature.Hosting/OpenFeatureBuilderExtensions.cs

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -163,47 +163,35 @@ internal static OpenFeatureBuilder AddClient(this OpenFeatureBuilder builder, st
163163
{
164164
if (string.IsNullOrWhiteSpace(name))
165165
{
166-
if (builder.IsContextConfigured)
166+
builder.Services.TryAddScoped<IFeatureClient>(static provider =>
167167
{
168-
builder.Services.TryAddScoped<IFeatureClient>(static provider =>
168+
var api = provider.GetRequiredService<Api>();
169+
var client = api.GetClient();
170+
171+
var context = provider.GetService<EvaluationContext>();
172+
if (context is not null)
169173
{
170-
var api = provider.GetRequiredService<Api>();
171-
var client = api.GetClient();
172-
var context = provider.GetRequiredService<EvaluationContext>();
173174
client.SetContext(context);
174-
return client;
175-
});
176-
}
177-
else
178-
{
179-
builder.Services.TryAddScoped<IFeatureClient>(static provider =>
180-
{
181-
var api = provider.GetRequiredService<Api>();
182-
return api.GetClient();
183-
});
184-
}
175+
}
176+
177+
return client;
178+
});
185179
}
186180
else
187181
{
188-
if (builder.IsContextConfigured)
182+
builder.Services.TryAddKeyedScoped<IFeatureClient>(name, static (provider, key) =>
189183
{
190-
builder.Services.TryAddKeyedScoped<IFeatureClient>(name, static (provider, key) =>
184+
var api = provider.GetRequiredService<Api>();
185+
var client = api.GetClient(key!.ToString());
186+
187+
var context = provider.GetService<EvaluationContext>();
188+
if (context is not null)
191189
{
192-
var api = provider.GetRequiredService<Api>();
193-
var client = api.GetClient(key!.ToString());
194-
var context = provider.GetRequiredService<EvaluationContext>();
195190
client.SetContext(context);
196-
return client;
197-
});
198-
}
199-
else
200-
{
201-
builder.Services.TryAddKeyedScoped<IFeatureClient>(name, static (provider, key) =>
202-
{
203-
var api = provider.GetRequiredService<Api>();
204-
return api.GetClient(key!.ToString());
205-
});
206-
}
191+
}
192+
193+
return client;
194+
});
207195
}
208196

209197
return builder;

test/OpenFeature.Hosting.Tests/OpenFeatureBuilderExtensionsTests.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,31 @@ public void AddClient_WithNameAndContext_AddsFeatureClient()
518518
Assert.Equal("euw", region.AsString);
519519
}
520520

521+
[Fact]
522+
public void AddClient_WithContextAfterAddProvider_AddsFeatureClient()
523+
{
524+
// Arrange
525+
_services.AddSingleton(sp => Api.Instance);
526+
527+
_systemUnderTest
528+
.AddProvider("client-name", (_systemUnderTest, name) => new NoOpFeatureProvider());
529+
530+
// Act
531+
_systemUnderTest
532+
.AddClient("client-name")
533+
.AddContext((a) => a.Set("region", "euw"));
534+
535+
// Act
536+
using var serviceProvider = _services.BuildServiceProvider();
537+
var client = serviceProvider.GetKeyedService<IFeatureClient>("client-name");
538+
539+
Assert.NotNull(client);
540+
541+
var context = client.GetContext();
542+
var region = context.GetValue("region");
543+
Assert.Equal("euw", region.AsString);
544+
}
545+
521546
[Fact]
522547
public void AddPolicyBasedClient_AddsScopedFeatureClient()
523548
{

0 commit comments

Comments
 (0)