diff --git a/src/ModularPipelines/Engine/OptionsProvider.cs b/src/ModularPipelines/Engine/OptionsProvider.cs index 204822158a..05e0bca9f2 100644 --- a/src/ModularPipelines/Engine/OptionsProvider.cs +++ b/src/ModularPipelines/Engine/OptionsProvider.cs @@ -13,6 +13,11 @@ internal class OptionsProvider : IOptionsProvider /// private static readonly ConcurrentDictionary> ValueGetterCache = new(); + /// + /// Cache of constructed IOptions<T> types to avoid repeated MakeGenericType calls. + /// + private static readonly ConcurrentDictionary IOptionsTypeCache = new(); + /// /// Set of generic type definitions that indicate an options-related type. /// Using a HashSet for O(1) lookup instead of multiple IsAssignableTo calls. @@ -53,8 +58,11 @@ public OptionsProvider(IPipelineServiceContainerWrapper pipelineServiceContainer .Distinct() .ToList(); - foreach (var option in _cachedOptionTypes.Select(t => _serviceProvider.GetService(typeof(IOptions<>).MakeGenericType(t)))) + foreach (var t in _cachedOptionTypes) { + var optionsType = IOptionsTypeCache.GetOrAdd(t, static innerType => typeof(IOptions<>).MakeGenericType(innerType)); + var option = _serviceProvider.GetService(optionsType); + if (option is null) { continue;