Skip to content
Draft
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
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,7 @@ public async ValueTask EnsureInitializedAsync(CancellationToken cancellationToke
await _featureApi.SetProviderAsync(name, featureProvider).ConfigureAwait(false);
}

var hooks = new List<Hook>();
foreach (var hookName in options.HookNames)
{
var hook = _serviceProvider.GetRequiredKeyedService<Hook>(hookName);
hooks.Add(hook);
}

var hooks = _serviceProvider.GetServices<Hook>();
_featureApi.AddHooks(hooks);

var handlers = _serviceProvider.GetServices<EventHandlerDelegateWrapper>();
Expand Down
6 changes: 2 additions & 4 deletions src/OpenFeature.Hosting/OpenFeatureBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -330,18 +330,16 @@ public static OpenFeatureBuilder AddHook<
(this OpenFeatureBuilder builder, string hookName, Func<IServiceProvider, THook>? implementationFactory = null)
where THook : Hook
{
builder.Services.PostConfigure<OpenFeatureOptions>(options => options.AddHookName(hookName));

if (implementationFactory is not null)
{
builder.Services.TryAddKeyedSingleton<Hook>(hookName, (serviceProvider, key) =>
builder.Services.AddSingleton<Hook>((serviceProvider) =>
{
return implementationFactory(serviceProvider);
});
}
else
{
builder.Services.TryAddKeyedSingleton<Hook, THook>(hookName);
builder.Services.AddSingleton<Hook, THook>();
}

return builder;
Expand Down
12 changes: 0 additions & 12 deletions src/OpenFeature.Hosting/OpenFeatureOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,4 @@ protected internal void AddProviderName(string? name)
}
}
}

private readonly HashSet<string> _hookNames = [];

internal IReadOnlyCollection<string> HookNames => _hookNames;

internal void AddHookName(string name)
{
lock (_hookNames)
{
_hookNames.Add(name);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,9 @@ public async Task EnsureInitializedAsync_AddsHooks()
services.AddOptions<OpenFeatureOptions>().Configure(options =>
{
options.AddProviderName(null);
options.AddHookName("TestHook");
});
services.AddSingleton<FeatureProvider>(provider);
services.AddKeyedSingleton<Hook>("TestHook", hook);
services.AddSingleton<Hook>(hook);

var api = Api.Instance;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -256,45 +256,15 @@ public void AddProvider_WithNullKey_ThrowsArgumentNullException()
}

[Fact]
public void AddHook_AddsHookAsKeyedService()
public void AddHook_AddsHookAsSingletonService()
{
// Arrange
_systemUnderTest.AddHook<NoOpHook>();

var serviceProvider = _services.BuildServiceProvider();

// Act
var hook = serviceProvider.GetKeyedService<Hook>("NoOpHook");

// Assert
Assert.NotNull(hook);
}

[Fact]
public void AddHook_AddsHookNameToOpenFeatureOptions()
{
// Arrange
_systemUnderTest.AddHook(sp => new NoOpHook());

var serviceProvider = _services.BuildServiceProvider();

// Act
var options = serviceProvider.GetRequiredService<IOptions<OpenFeatureOptions>>();

// Assert
Assert.Contains(options.Value.HookNames, t => t == "NoOpHook");
}

[Fact]
public void AddHook_WithSpecifiedNameToOpenFeatureOptions()
{
// Arrange
_systemUnderTest.AddHook<NoOpHook>("my-custom-name");

var serviceProvider = _services.BuildServiceProvider();

// Act
var hook = serviceProvider.GetKeyedService<Hook>("my-custom-name");
var hook = serviceProvider.GetRequiredService<Hook>();

// Assert
Assert.NotNull(hook);
Expand All @@ -309,14 +279,14 @@ public void AddHook_WithSpecifiedNameAndImplementationFactory_AsKeyedService()
var serviceProvider = _services.BuildServiceProvider();

// Act
var hook = serviceProvider.GetKeyedService<Hook>("my-custom-name");
var hook = serviceProvider.GetRequiredService<Hook>();

// Assert
Assert.NotNull(hook);
}

[Fact]
public void AddHook_WithInstance_AddsHookAsKeyedService()
public void AddHook_WithInstance_AddsHookAsSingletonService()
{
// Arrange
var expectedHook = new NoOpHook();
Expand All @@ -325,15 +295,15 @@ public void AddHook_WithInstance_AddsHookAsKeyedService()
var serviceProvider = _services.BuildServiceProvider();

// Act
var actualHook = serviceProvider.GetKeyedService<Hook>("NoOpHook");
var actualHook = serviceProvider.GetRequiredService<Hook>();

// Assert
Assert.NotNull(actualHook);
Assert.Equal(expectedHook, actualHook);
}

[Fact]
public void AddHook_WithSpecifiedNameAndInstance_AddsHookAsKeyedService()
public void AddHook_WithSpecifiedNameAndInstance_AddsHookAsSingletonService()
{
// Arrange
var expectedHook = new NoOpHook();
Expand All @@ -342,7 +312,7 @@ public void AddHook_WithSpecifiedNameAndInstance_AddsHookAsKeyedService()
var serviceProvider = _services.BuildServiceProvider();

// Act
var actualHook = serviceProvider.GetKeyedService<Hook>("custom-hook");
var actualHook = serviceProvider.GetRequiredService<Hook>();

// Assert
Assert.NotNull(actualHook);
Expand Down
13 changes: 0 additions & 13 deletions test/OpenFeature.Hosting.Tests/OpenFeatureOptionsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,17 +57,4 @@ public void AddProviderName_WithSameName_OnlyRegistersNameOnce()
// Assert
Assert.Single(options.ProviderNames);
}

[Fact]
public void AddHookName_RegistersHookName()
{
// Arrange
var options = new OpenFeatureOptions();

// Act
options.AddHookName("test-hook");

// Assert
Assert.Single(options.HookNames);
}
}