Skip to content

Deduplicate DependsOnResolutionFunc and KeyedDependsOnResolutionFunc #26

Description

@AGiorgetti

Description

DependsOnResolutionFunc<TTarget> and KeyedDependsOnResolutionFunc<TTarget> in ServiceCollectionExtensions.KeyedService.cs share ~90% of their logic. The entire parameter resolution loop (matching dependsOn entries, resolving keyed vs non-keyed services) is duplicated. The only difference is the factory signature: Func<IServiceProvider, TTarget> vs Func<IServiceProvider, object?, TTarget>.

Suggested Fix

Extract the common resolution logic into a shared private method:

private static object[] ResolveConstructorArgs(
    IServiceProvider sp, Dependency[] dependsOn, ParameterInfo[] parameters)
{
    if (sp is not IKeyedServiceProvider keyed)
        throw new NotSupportedException(...);

    var args = new object[parameters.Length];
    for (int i = 0; i < args.Length; i++)
    {
        var p = parameters[i];
        var dep = Array.Find(dependsOn, d => d.ParameterName == p.Name);
        if (dep != null)
        {
            args[i] = dep.T == Dependency.DependencyType.KeyedServices
                ? keyed.GetRequiredKeyedService(p.ParameterType, dep.Value)
                : dep.Value;
        }
        else
        {
            args[i] = sp.GetRequiredService(p.ParameterType);
        }
    }
    return args;
}

This would also help resolve the cognitive complexity warnings on both methods.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions