Skip to content

[FromKeyedServices("keyName")] Keyed services support in Microsoft.Extensions.DependencyInjection is not resolving dependency in constructor  #92076

Description

@nitish-kaushik

Is there an existing issue for this?

  • I have searched the existing issues

Describe the bug

I am trying the new Support for keyed services in minimal APIs, MVC, and SignalR feature in Asp.Net Core Web API Controller. The dependency works fine when I resolve them directly in the action method of the controller but throws an exception if resolve it in the controller constructor.

Here is my code:

public interface IEmployee
{
string GetMessage();
}
public class Employee : IEmployee
{
public string GetMessage()
{
return "Hello from Employee";
}
}
public class TempEmployee : IEmployee
{
public string GetMessage()
{
return "Hello from Temp Employee";
}
}

And this is how I have registered them in the program.cs class.

builder.Services.AddKeyedSingleton<IEmployee, Employee>("employee");
builder.Services.AddKeyedSingleton<IEmployee, TempEmployee>("tempEmployee");

Here is the code from the Controller:

This works fine if resolving the dependency directly in the method

[HttpGet("temp")]
public ActionResult GetTempEmployee([FromKeyedServices("tempEmployee")] IEmployee tempEmployee)
{
return Ok(tempEmployee.GetMessage());
}

But If I try to inject this dependency in the constructor then get the error:

[ApiController]
[Route("[controller]")]
public class EmployeeController : ControllerBase
{
private readonly IEmployee tempEmployee;
public EmployeeController([FromKeyedServices("tempEmployee")] IEmployee _tempEmployee)
{
tempEmployee = _tempEmployee;
}
[HttpGet("temp")]
public ActionResult GetTempEmployee()
{
return Ok(tempEmployee.GetMessage());
}
}

Error:

System.InvalidOperationException: Unable to resolve service for type 'WebApplication5.IEmployee' while attempting to activate 'WebApplication5.Controllers.EmployeeController'.
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ThrowHelperUnableToResolveService(Type type, Type requiredBy)
at lambda_method3(Closure, IServiceProvider, Object[])
at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
HEADERS
=======
Accept: */*
Host: localhost:7212
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,hi;q=0.8
Referer: https://localhost:7212/swagger/index.html
sec-ch-ua: "Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
sec-fetch-site: same-origin
sec-fetch-mode: cors
sec-fetch-dest: empty

My System Setup

Microsoft Visual Studio Enterprise 2022 (64-bit)
Preview Version 17.8.0 Preview 1.0

Windows:
Edition Windows 11 Home Single Language
Version 22H2
OS build 22621.2134
Experience Windows Feature Experience Pack 1000.22659.1000.0

Output form dotnet --info command

C:\Users\Nitish>dotnet --info
.NET SDK:
Version: 8.0.100-rc.1.23455.8
Commit: e14caf947f

Runtime Environment:
OS Name: Windows
OS Version: 10.0.22621
OS Platform: Windows
RID: win-x64
Base Path: C:\Program Files\dotnet\sdk\8.0.100-rc.1.23455.8\

.NET workloads installed:
There are no installed workloads to display.

Host:
Version: 8.0.0-rc.1.23419.4
Architecture: x64
Commit: 9295993
RID: win-x64

.NET SDKs installed:
6.0.101 [C:\Program Files\dotnet\sdk]
7.0.102 [C:\Program Files\dotnet\sdk]
8.0.100-preview.7.23376.3 [C:\Program Files\dotnet\sdk]
8.0.100-rc.1.23455.8 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
Microsoft.AspNetCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 8.0.0-preview.7.23375.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 8.0.0-rc.1.23421.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 6.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 8.0.0-preview.7.23375.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 8.0.0-rc.1.23419.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 8.0.0-preview.7.23376.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 8.0.0-rc.1.23420.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Other architectures found:
x86 [C:\Program Files (x86)\dotnet]
registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

Environment variables:
Not set

global.json file:
Not found

Learn more:
https://aka.ms/dotnet/info

Download .NET:
https://aka.ms/dotnet/download

Expected Behavior

The Keyed services support should work in the constructor too.

Steps To Reproduce

No response

Exceptions (if any)

No response

.NET Version

8.0.100-rc.1.23455.8

Anything else?

dotnet --info

.NET SDK:
Version: 8.0.100-rc.1.23455.8
Commit: e14caf947f

Runtime Environment:
OS Name: Windows
OS Version: 10.0.22621
OS Platform: Windows
RID: win-x64
Base Path: C:\Program Files\dotnet\sdk\8.0.100-rc.1.23455.8\

.NET workloads installed:
There are no installed workloads to display.

Host:
Version: 8.0.0-rc.1.23419.4
Architecture: x64
Commit: 9295993
RID: win-x64

.NET SDKs installed:
6.0.101 [C:\Program Files\dotnet\sdk]
7.0.102 [C:\Program Files\dotnet\sdk]
8.0.100-preview.7.23376.3 [C:\Program Files\dotnet\sdk]
8.0.100-rc.1.23455.8 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
Microsoft.AspNetCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 8.0.0-preview.7.23375.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 8.0.0-rc.1.23421.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 6.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 8.0.0-preview.7.23375.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 8.0.0-rc.1.23419.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 8.0.0-preview.7.23376.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 8.0.0-rc.1.23420.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Other architectures found:
x86 [C:\Program Files (x86)\dotnet]
registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

Environment variables:
Not set

global.json file:
Not found

Learn more:
https://aka.ms/dotnet/info

Download .NET:
https://aka.ms/dotnet/download

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
     blocks
    (function() {
    function addCopyButtons() {
    document.querySelectorAll('pre code').forEach(function(codeBlock) {
    if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
    codeBlock.parentElement.setAttribute('data-copy-added', 'true');
    var btn = document.createElement('button');
    btn.textContent = 'Copy';
    btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
    btn.onmouseover = function() { this.style.opacity = '1'; };
    btn.onmouseout = function() { this.style.opacity = '0.7'; };
    btn.onclick = function() {
    navigator.clipboard.writeText(codeBlock.textContent).then(function() {
    btn.textContent = 'Copied!';
    setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
    });
    };
    codeBlock.parentElement.style.position = 'relative';
    codeBlock.parentElement.appendChild(btn);
    });
    }
    addCopyButtons();
    // Re-run on dynamic content
    var observer = new MutationObserver(addCopyButtons);
    observer.observe(document.body, { childList: true, subtree: true });
    })();
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    [FromKeyedServices("keyName")] Keyed services support in Microsoft.Extensions.DependencyInjection is not resolving dependency in constructor · Issue #92076 · dotnet/runtime · GitHub
    Skip to content

    [FromKeyedServices("keyName")] Keyed services support in Microsoft.Extensions.DependencyInjection is not resolving dependency in constructor  #92076

    Description

    @nitish-kaushik

    Is there an existing issue for this?

    • I have searched the existing issues

    Describe the bug

    I am trying the new Support for keyed services in minimal APIs, MVC, and SignalR feature in Asp.Net Core Web API Controller. The dependency works fine when I resolve them directly in the action method of the controller but throws an exception if resolve it in the controller constructor.

    Here is my code:

    public interface IEmployee
    {
    string GetMessage();
    }
    
    public class Employee : IEmployee
    {
    public string GetMessage()
    {
    return "Hello from Employee";
    }
    }
    
    public class TempEmployee : IEmployee
    {
    public string GetMessage()
    {
    return "Hello from Temp Employee";
    }
    }
    

    And this is how I have registered them in the program.cs class.

    builder.Services.AddKeyedSingleton<IEmployee, Employee>("employee");
    builder.Services.AddKeyedSingleton<IEmployee, TempEmployee>("tempEmployee");
    

    Here is the code from the Controller:

    This works fine if resolving the dependency directly in the method

    [HttpGet("temp")]
    public ActionResult GetTempEmployee([FromKeyedServices("tempEmployee")] IEmployee tempEmployee)
    {
    return Ok(tempEmployee.GetMessage());
    }
    

    But If I try to inject this dependency in the constructor then get the error:

    [ApiController]
    [Route("[controller]")]
    public class EmployeeController : ControllerBase
    {
    private readonly IEmployee tempEmployee;
    public EmployeeController([FromKeyedServices("tempEmployee")] IEmployee _tempEmployee)
    {
    tempEmployee = _tempEmployee;
    }
    [HttpGet("temp")]
    public ActionResult GetTempEmployee()
    {
    return Ok(tempEmployee.GetMessage());
    }
    }
    

    Error:

    System.InvalidOperationException: Unable to resolve service for type 'WebApplication5.IEmployee' while attempting to activate 'WebApplication5.Controllers.EmployeeController'.
    at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ThrowHelperUnableToResolveService(Type type, Type requiredBy)
    at lambda_method3(Closure, IServiceProvider, Object[])
    at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
    at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
    at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
    --- End of stack trace from previous location ---
    at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
    at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
    at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
    at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
    at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
    at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
    at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
    at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
    HEADERS
    =======
    Accept: */*
    Host: localhost:7212
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
    Accept-Encoding: gzip, deflate, br
    Accept-Language: en-US,en;q=0.9,hi;q=0.8
    Referer: https://localhost:7212/swagger/index.html
    sec-ch-ua: "Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"
    sec-ch-ua-mobile: ?0
    sec-ch-ua-platform: "Windows"
    sec-fetch-site: same-origin
    sec-fetch-mode: cors
    sec-fetch-dest: empty
    

    My System Setup

    Microsoft Visual Studio Enterprise 2022 (64-bit)
    Preview Version 17.8.0 Preview 1.0

    Windows:
    Edition Windows 11 Home Single Language
    Version 22H2
    OS build 22621.2134
    Experience Windows Feature Experience Pack 1000.22659.1000.0

    Output form dotnet --info command

    C:\Users\Nitish>dotnet --info
    .NET SDK:
    Version: 8.0.100-rc.1.23455.8
    Commit: e14caf947f

    Runtime Environment:
    OS Name: Windows
    OS Version: 10.0.22621
    OS Platform: Windows
    RID: win-x64
    Base Path: C:\Program Files\dotnet\sdk\8.0.100-rc.1.23455.8\

    .NET workloads installed:
    There are no installed workloads to display.

    Host:
    Version: 8.0.0-rc.1.23419.4
    Architecture: x64
    Commit: 9295993
    RID: win-x64

    .NET SDKs installed:
    6.0.101 [C:\Program Files\dotnet\sdk]
    7.0.102 [C:\Program Files\dotnet\sdk]
    8.0.100-preview.7.23376.3 [C:\Program Files\dotnet\sdk]
    8.0.100-rc.1.23455.8 [C:\Program Files\dotnet\sdk]

    .NET runtimes installed:
    Microsoft.AspNetCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
    Microsoft.AspNetCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
    Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
    Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
    Microsoft.AspNetCore.App 8.0.0-preview.7.23375.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
    Microsoft.AspNetCore.App 8.0.0-rc.1.23421.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
    Microsoft.NETCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
    Microsoft.NETCore.App 6.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
    Microsoft.NETCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
    Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
    Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
    Microsoft.NETCore.App 8.0.0-preview.7.23375.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
    Microsoft.NETCore.App 8.0.0-rc.1.23419.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
    Microsoft.WindowsDesktop.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
    Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
    Microsoft.WindowsDesktop.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
    Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
    Microsoft.WindowsDesktop.App 8.0.0-preview.7.23376.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
    Microsoft.WindowsDesktop.App 8.0.0-rc.1.23420.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

    Other architectures found:
    x86 [C:\Program Files (x86)\dotnet]
    registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

    Environment variables:
    Not set

    global.json file:
    Not found

    Learn more:
    https://aka.ms/dotnet/info

    Download .NET:
    https://aka.ms/dotnet/download

    Expected Behavior

    The Keyed services support should work in the constructor too.

    Steps To Reproduce

    No response

    Exceptions (if any)

    No response

    .NET Version

    8.0.100-rc.1.23455.8

    Anything else?

    dotnet --info

    .NET SDK:
    Version: 8.0.100-rc.1.23455.8
    Commit: e14caf947f

    Runtime Environment:
    OS Name: Windows
    OS Version: 10.0.22621
    OS Platform: Windows
    RID: win-x64
    Base Path: C:\Program Files\dotnet\sdk\8.0.100-rc.1.23455.8\

    .NET workloads installed:
    There are no installed workloads to display.

    Host:
    Version: 8.0.0-rc.1.23419.4
    Architecture: x64
    Commit: 9295993
    RID: win-x64

    .NET SDKs installed:
    6.0.101 [C:\Program Files\dotnet\sdk]
    7.0.102 [C:\Program Files\dotnet\sdk]
    8.0.100-preview.7.23376.3 [C:\Program Files\dotnet\sdk]
    8.0.100-rc.1.23455.8 [C:\Program Files\dotnet\sdk]

    .NET runtimes installed:
    Microsoft.AspNetCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
    Microsoft.AspNetCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
    Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
    Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
    Microsoft.AspNetCore.App 8.0.0-preview.7.23375.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
    Microsoft.AspNetCore.App 8.0.0-rc.1.23421.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
    Microsoft.NETCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
    Microsoft.NETCore.App 6.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
    Microsoft.NETCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
    Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
    Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
    Microsoft.NETCore.App 8.0.0-preview.7.23375.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
    Microsoft.NETCore.App 8.0.0-rc.1.23419.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
    Microsoft.WindowsDesktop.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
    Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
    Microsoft.WindowsDesktop.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
    Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
    Microsoft.WindowsDesktop.App 8.0.0-preview.7.23376.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
    Microsoft.WindowsDesktop.App 8.0.0-rc.1.23420.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

    Other architectures found:
    x86 [C:\Program Files (x86)\dotnet]
    registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

    Environment variables:
    Not set

    global.json file:
    Not found

    Learn more:
    https://aka.ms/dotnet/info

    Download .NET:
    https://aka.ms/dotnet/download

    Metadata

    Metadata

    Assignees

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [FromKeyedServices("keyName")] Keyed services support in Microsoft.Extensions.DependencyInjection is not resolving dependency in constructor · Issue #92076 · dotnet/runtime · GitHub
      Skip to content

      [FromKeyedServices("keyName")] Keyed services support in Microsoft.Extensions.DependencyInjection is not resolving dependency in constructor  #92076

      Description

      @nitish-kaushik

      Is there an existing issue for this?

      • I have searched the existing issues

      Describe the bug

      I am trying the new Support for keyed services in minimal APIs, MVC, and SignalR feature in Asp.Net Core Web API Controller. The dependency works fine when I resolve them directly in the action method of the controller but throws an exception if resolve it in the controller constructor.

      Here is my code:

      public interface IEmployee
      {
      string GetMessage();
      }
      
      public class Employee : IEmployee
      {
      public string GetMessage()
      {
      return "Hello from Employee";
      }
      }
      
      public class TempEmployee : IEmployee
      {
      public string GetMessage()
      {
      return "Hello from Temp Employee";
      }
      }
      

      And this is how I have registered them in the program.cs class.

      builder.Services.AddKeyedSingleton<IEmployee, Employee>("employee");
      builder.Services.AddKeyedSingleton<IEmployee, TempEmployee>("tempEmployee");
      

      Here is the code from the Controller:

      This works fine if resolving the dependency directly in the method

      [HttpGet("temp")]
      public ActionResult GetTempEmployee([FromKeyedServices("tempEmployee")] IEmployee tempEmployee)
      {
      return Ok(tempEmployee.GetMessage());
      }
      

      But If I try to inject this dependency in the constructor then get the error:

      [ApiController]
      [Route("[controller]")]
      public class EmployeeController : ControllerBase
      {
      private readonly IEmployee tempEmployee;
      public EmployeeController([FromKeyedServices("tempEmployee")] IEmployee _tempEmployee)
      {
      tempEmployee = _tempEmployee;
      }
      [HttpGet("temp")]
      public ActionResult GetTempEmployee()
      {
      return Ok(tempEmployee.GetMessage());
      }
      }
      

      Error:

      System.InvalidOperationException: Unable to resolve service for type 'WebApplication5.IEmployee' while attempting to activate 'WebApplication5.Controllers.EmployeeController'.
      at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ThrowHelperUnableToResolveService(Type type, Type requiredBy)
      at lambda_method3(Closure, IServiceProvider, Object[])
      at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
      at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
      at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
      --- End of stack trace from previous location ---
      at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
      at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
      at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
      at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
      at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
      at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
      at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
      at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
      HEADERS
      =======
      Accept: */*
      Host: localhost:7212
      User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
      Accept-Encoding: gzip, deflate, br
      Accept-Language: en-US,en;q=0.9,hi;q=0.8
      Referer: https://localhost:7212/swagger/index.html
      sec-ch-ua: "Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"
      sec-ch-ua-mobile: ?0
      sec-ch-ua-platform: "Windows"
      sec-fetch-site: same-origin
      sec-fetch-mode: cors
      sec-fetch-dest: empty
      

      My System Setup

      Microsoft Visual Studio Enterprise 2022 (64-bit)
      Preview Version 17.8.0 Preview 1.0

      Windows:
      Edition Windows 11 Home Single Language
      Version 22H2
      OS build 22621.2134
      Experience Windows Feature Experience Pack 1000.22659.1000.0

      Output form dotnet --info command

      C:\Users\Nitish>dotnet --info
      .NET SDK:
      Version: 8.0.100-rc.1.23455.8
      Commit: e14caf947f

      Runtime Environment:
      OS Name: Windows
      OS Version: 10.0.22621
      OS Platform: Windows
      RID: win-x64
      Base Path: C:\Program Files\dotnet\sdk\8.0.100-rc.1.23455.8\

      .NET workloads installed:
      There are no installed workloads to display.

      Host:
      Version: 8.0.0-rc.1.23419.4
      Architecture: x64
      Commit: 9295993
      RID: win-x64

      .NET SDKs installed:
      6.0.101 [C:\Program Files\dotnet\sdk]
      7.0.102 [C:\Program Files\dotnet\sdk]
      8.0.100-preview.7.23376.3 [C:\Program Files\dotnet\sdk]
      8.0.100-rc.1.23455.8 [C:\Program Files\dotnet\sdk]

      .NET runtimes installed:
      Microsoft.AspNetCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
      Microsoft.AspNetCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
      Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
      Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
      Microsoft.AspNetCore.App 8.0.0-preview.7.23375.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
      Microsoft.AspNetCore.App 8.0.0-rc.1.23421.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
      Microsoft.NETCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
      Microsoft.NETCore.App 6.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
      Microsoft.NETCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
      Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
      Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
      Microsoft.NETCore.App 8.0.0-preview.7.23375.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
      Microsoft.NETCore.App 8.0.0-rc.1.23419.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
      Microsoft.WindowsDesktop.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
      Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
      Microsoft.WindowsDesktop.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
      Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
      Microsoft.WindowsDesktop.App 8.0.0-preview.7.23376.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
      Microsoft.WindowsDesktop.App 8.0.0-rc.1.23420.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

      Other architectures found:
      x86 [C:\Program Files (x86)\dotnet]
      registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

      Environment variables:
      Not set

      global.json file:
      Not found

      Learn more:
      https://aka.ms/dotnet/info

      Download .NET:
      https://aka.ms/dotnet/download

      Expected Behavior

      The Keyed services support should work in the constructor too.

      Steps To Reproduce

      No response

      Exceptions (if any)

      No response

      .NET Version

      8.0.100-rc.1.23455.8

      Anything else?

      dotnet --info

      .NET SDK:
      Version: 8.0.100-rc.1.23455.8
      Commit: e14caf947f

      Runtime Environment:
      OS Name: Windows
      OS Version: 10.0.22621
      OS Platform: Windows
      RID: win-x64
      Base Path: C:\Program Files\dotnet\sdk\8.0.100-rc.1.23455.8\

      .NET workloads installed:
      There are no installed workloads to display.

      Host:
      Version: 8.0.0-rc.1.23419.4
      Architecture: x64
      Commit: 9295993
      RID: win-x64

      .NET SDKs installed:
      6.0.101 [C:\Program Files\dotnet\sdk]
      7.0.102 [C:\Program Files\dotnet\sdk]
      8.0.100-preview.7.23376.3 [C:\Program Files\dotnet\sdk]
      8.0.100-rc.1.23455.8 [C:\Program Files\dotnet\sdk]

      .NET runtimes installed:
      Microsoft.AspNetCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
      Microsoft.AspNetCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
      Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
      Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
      Microsoft.AspNetCore.App 8.0.0-preview.7.23375.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
      Microsoft.AspNetCore.App 8.0.0-rc.1.23421.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
      Microsoft.NETCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
      Microsoft.NETCore.App 6.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
      Microsoft.NETCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
      Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
      Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
      Microsoft.NETCore.App 8.0.0-preview.7.23375.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
      Microsoft.NETCore.App 8.0.0-rc.1.23419.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
      Microsoft.WindowsDesktop.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
      Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
      Microsoft.WindowsDesktop.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
      Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
      Microsoft.WindowsDesktop.App 8.0.0-preview.7.23376.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
      Microsoft.WindowsDesktop.App 8.0.0-rc.1.23420.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

      Other architectures found:
      x86 [C:\Program Files (x86)\dotnet]
      registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

      Environment variables:
      Not set

      global.json file:
      Not found

      Learn more:
      https://aka.ms/dotnet/info

      Download .NET:
      https://aka.ms/dotnet/download

      Metadata

      Metadata

      Assignees

      Type

      No type

      Projects

      No projects

        Milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [FromKeyedServices("keyName")] Keyed services support in Microsoft.Extensions.DependencyInjection is not resolving dependency in constructor · Issue #92076 · dotnet/runtime · GitHub
        Skip to content

        [FromKeyedServices("keyName")] Keyed services support in Microsoft.Extensions.DependencyInjection is not resolving dependency in constructor  #92076

        Description

        @nitish-kaushik

        Is there an existing issue for this?

        • I have searched the existing issues

        Describe the bug

        I am trying the new Support for keyed services in minimal APIs, MVC, and SignalR feature in Asp.Net Core Web API Controller. The dependency works fine when I resolve them directly in the action method of the controller but throws an exception if resolve it in the controller constructor.

        Here is my code:

        public interface IEmployee
        {
        string GetMessage();
        }
        
        public class Employee : IEmployee
        {
        public string GetMessage()
        {
        return "Hello from Employee";
        }
        }
        
        public class TempEmployee : IEmployee
        {
        public string GetMessage()
        {
        return "Hello from Temp Employee";
        }
        }
        

        And this is how I have registered them in the program.cs class.

        builder.Services.AddKeyedSingleton<IEmployee, Employee>("employee");
        builder.Services.AddKeyedSingleton<IEmployee, TempEmployee>("tempEmployee");
        

        Here is the code from the Controller:

        This works fine if resolving the dependency directly in the method

        [HttpGet("temp")]
        public ActionResult GetTempEmployee([FromKeyedServices("tempEmployee")] IEmployee tempEmployee)
        {
        return Ok(tempEmployee.GetMessage());
        }
        

        But If I try to inject this dependency in the constructor then get the error:

        [ApiController]
        [Route("[controller]")]
        public class EmployeeController : ControllerBase
        {
        private readonly IEmployee tempEmployee;
        public EmployeeController([FromKeyedServices("tempEmployee")] IEmployee _tempEmployee)
        {
        tempEmployee = _tempEmployee;
        }
        [HttpGet("temp")]
        public ActionResult GetTempEmployee()
        {
        return Ok(tempEmployee.GetMessage());
        }
        }
        

        Error:

        System.InvalidOperationException: Unable to resolve service for type 'WebApplication5.IEmployee' while attempting to activate 'WebApplication5.Controllers.EmployeeController'.
        at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ThrowHelperUnableToResolveService(Type type, Type requiredBy)
        at lambda_method3(Closure, IServiceProvider, Object[])
        at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
        at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
        at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
        --- End of stack trace from previous location ---
        at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
        at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
        at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
        at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
        at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
        at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
        at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
        at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
        HEADERS
        =======
        Accept: */*
        Host: localhost:7212
        User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
        Accept-Encoding: gzip, deflate, br
        Accept-Language: en-US,en;q=0.9,hi;q=0.8
        Referer: https://localhost:7212/swagger/index.html
        sec-ch-ua: "Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"
        sec-ch-ua-mobile: ?0
        sec-ch-ua-platform: "Windows"
        sec-fetch-site: same-origin
        sec-fetch-mode: cors
        sec-fetch-dest: empty
        

        My System Setup

        Microsoft Visual Studio Enterprise 2022 (64-bit)
        Preview Version 17.8.0 Preview 1.0

        Windows:
        Edition Windows 11 Home Single Language
        Version 22H2
        OS build 22621.2134
        Experience Windows Feature Experience Pack 1000.22659.1000.0

        Output form dotnet --info command

        C:\Users\Nitish>dotnet --info
        .NET SDK:
        Version: 8.0.100-rc.1.23455.8
        Commit: e14caf947f

        Runtime Environment:
        OS Name: Windows
        OS Version: 10.0.22621
        OS Platform: Windows
        RID: win-x64
        Base Path: C:\Program Files\dotnet\sdk\8.0.100-rc.1.23455.8\

        .NET workloads installed:
        There are no installed workloads to display.

        Host:
        Version: 8.0.0-rc.1.23419.4
        Architecture: x64
        Commit: 9295993
        RID: win-x64

        .NET SDKs installed:
        6.0.101 [C:\Program Files\dotnet\sdk]
        7.0.102 [C:\Program Files\dotnet\sdk]
        8.0.100-preview.7.23376.3 [C:\Program Files\dotnet\sdk]
        8.0.100-rc.1.23455.8 [C:\Program Files\dotnet\sdk]

        .NET runtimes installed:
        Microsoft.AspNetCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
        Microsoft.AspNetCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
        Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
        Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
        Microsoft.AspNetCore.App 8.0.0-preview.7.23375.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
        Microsoft.AspNetCore.App 8.0.0-rc.1.23421.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
        Microsoft.NETCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
        Microsoft.NETCore.App 6.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
        Microsoft.NETCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
        Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
        Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
        Microsoft.NETCore.App 8.0.0-preview.7.23375.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
        Microsoft.NETCore.App 8.0.0-rc.1.23419.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
        Microsoft.WindowsDesktop.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
        Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
        Microsoft.WindowsDesktop.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
        Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
        Microsoft.WindowsDesktop.App 8.0.0-preview.7.23376.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
        Microsoft.WindowsDesktop.App 8.0.0-rc.1.23420.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

        Other architectures found:
        x86 [C:\Program Files (x86)\dotnet]
        registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

        Environment variables:
        Not set

        global.json file:
        Not found

        Learn more:
        https://aka.ms/dotnet/info

        Download .NET:
        https://aka.ms/dotnet/download

        Expected Behavior

        The Keyed services support should work in the constructor too.

        Steps To Reproduce

        No response

        Exceptions (if any)

        No response

        .NET Version

        8.0.100-rc.1.23455.8

        Anything else?

        dotnet --info

        .NET SDK:
        Version: 8.0.100-rc.1.23455.8
        Commit: e14caf947f

        Runtime Environment:
        OS Name: Windows
        OS Version: 10.0.22621
        OS Platform: Windows
        RID: win-x64
        Base Path: C:\Program Files\dotnet\sdk\8.0.100-rc.1.23455.8\

        .NET workloads installed:
        There are no installed workloads to display.

        Host:
        Version: 8.0.0-rc.1.23419.4
        Architecture: x64
        Commit: 9295993
        RID: win-x64

        .NET SDKs installed:
        6.0.101 [C:\Program Files\dotnet\sdk]
        7.0.102 [C:\Program Files\dotnet\sdk]
        8.0.100-preview.7.23376.3 [C:\Program Files\dotnet\sdk]
        8.0.100-rc.1.23455.8 [C:\Program Files\dotnet\sdk]

        .NET runtimes installed:
        Microsoft.AspNetCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
        Microsoft.AspNetCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
        Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
        Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
        Microsoft.AspNetCore.App 8.0.0-preview.7.23375.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
        Microsoft.AspNetCore.App 8.0.0-rc.1.23421.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
        Microsoft.NETCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
        Microsoft.NETCore.App 6.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
        Microsoft.NETCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
        Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
        Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
        Microsoft.NETCore.App 8.0.0-preview.7.23375.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
        Microsoft.NETCore.App 8.0.0-rc.1.23419.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
        Microsoft.WindowsDesktop.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
        Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
        Microsoft.WindowsDesktop.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
        Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
        Microsoft.WindowsDesktop.App 8.0.0-preview.7.23376.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
        Microsoft.WindowsDesktop.App 8.0.0-rc.1.23420.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

        Other architectures found:
        x86 [C:\Program Files (x86)\dotnet]
        registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

        Environment variables:
        Not set

        global.json file:
        Not found

        Learn more:
        https://aka.ms/dotnet/info

        Download .NET:
        https://aka.ms/dotnet/download

        Metadata

        Metadata

        Assignees

        Type

        No type

        Projects

        No projects

          Milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' [FromKeyedServices("keyName")] Keyed services support in Microsoft.Extensions.DependencyInjection is not resolving dependency in constructor · Issue #92076 · dotnet/runtime · GitHub
          Skip to content

          [FromKeyedServices("keyName")] Keyed services support in Microsoft.Extensions.DependencyInjection is not resolving dependency in constructor  #92076

          Description

          @nitish-kaushik

          Is there an existing issue for this?

          • I have searched the existing issues

          Describe the bug

          I am trying the new Support for keyed services in minimal APIs, MVC, and SignalR feature in Asp.Net Core Web API Controller. The dependency works fine when I resolve them directly in the action method of the controller but throws an exception if resolve it in the controller constructor.

          Here is my code:

          public interface IEmployee
          {
          string GetMessage();
          }
          
          public class Employee : IEmployee
          {
          public string GetMessage()
          {
          return "Hello from Employee";
          }
          }
          
          public class TempEmployee : IEmployee
          {
          public string GetMessage()
          {
          return "Hello from Temp Employee";
          }
          }
          

          And this is how I have registered them in the program.cs class.

          builder.Services.AddKeyedSingleton<IEmployee, Employee>("employee");
          builder.Services.AddKeyedSingleton<IEmployee, TempEmployee>("tempEmployee");
          

          Here is the code from the Controller:

          This works fine if resolving the dependency directly in the method

          [HttpGet("temp")]
          public ActionResult GetTempEmployee([FromKeyedServices("tempEmployee")] IEmployee tempEmployee)
          {
          return Ok(tempEmployee.GetMessage());
          }
          

          But If I try to inject this dependency in the constructor then get the error:

          [ApiController]
          [Route("[controller]")]
          public class EmployeeController : ControllerBase
          {
          private readonly IEmployee tempEmployee;
          public EmployeeController([FromKeyedServices("tempEmployee")] IEmployee _tempEmployee)
          {
          tempEmployee = _tempEmployee;
          }
          [HttpGet("temp")]
          public ActionResult GetTempEmployee()
          {
          return Ok(tempEmployee.GetMessage());
          }
          }
          

          Error:

          System.InvalidOperationException: Unable to resolve service for type 'WebApplication5.IEmployee' while attempting to activate 'WebApplication5.Controllers.EmployeeController'.
          at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ThrowHelperUnableToResolveService(Type type, Type requiredBy)
          at lambda_method3(Closure, IServiceProvider, Object[])
          at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
          at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
          at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
          --- End of stack trace from previous location ---
          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
          at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
          at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
          at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
          at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
          at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
          HEADERS
          =======
          Accept: */*
          Host: localhost:7212
          User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
          Accept-Encoding: gzip, deflate, br
          Accept-Language: en-US,en;q=0.9,hi;q=0.8
          Referer: https://localhost:7212/swagger/index.html
          sec-ch-ua: "Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"
          sec-ch-ua-mobile: ?0
          sec-ch-ua-platform: "Windows"
          sec-fetch-site: same-origin
          sec-fetch-mode: cors
          sec-fetch-dest: empty
          

          My System Setup

          Microsoft Visual Studio Enterprise 2022 (64-bit)
          Preview Version 17.8.0 Preview 1.0

          Windows:
          Edition Windows 11 Home Single Language
          Version 22H2
          OS build 22621.2134
          Experience Windows Feature Experience Pack 1000.22659.1000.0

          Output form dotnet --info command

          C:\Users\Nitish>dotnet --info
          .NET SDK:
          Version: 8.0.100-rc.1.23455.8
          Commit: e14caf947f

          Runtime Environment:
          OS Name: Windows
          OS Version: 10.0.22621
          OS Platform: Windows
          RID: win-x64
          Base Path: C:\Program Files\dotnet\sdk\8.0.100-rc.1.23455.8\

          .NET workloads installed:
          There are no installed workloads to display.

          Host:
          Version: 8.0.0-rc.1.23419.4
          Architecture: x64
          Commit: 9295993
          RID: win-x64

          .NET SDKs installed:
          6.0.101 [C:\Program Files\dotnet\sdk]
          7.0.102 [C:\Program Files\dotnet\sdk]
          8.0.100-preview.7.23376.3 [C:\Program Files\dotnet\sdk]
          8.0.100-rc.1.23455.8 [C:\Program Files\dotnet\sdk]

          .NET runtimes installed:
          Microsoft.AspNetCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
          Microsoft.AspNetCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
          Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
          Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
          Microsoft.AspNetCore.App 8.0.0-preview.7.23375.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
          Microsoft.AspNetCore.App 8.0.0-rc.1.23421.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
          Microsoft.NETCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
          Microsoft.NETCore.App 6.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
          Microsoft.NETCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
          Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
          Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
          Microsoft.NETCore.App 8.0.0-preview.7.23375.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
          Microsoft.NETCore.App 8.0.0-rc.1.23419.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
          Microsoft.WindowsDesktop.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
          Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
          Microsoft.WindowsDesktop.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
          Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
          Microsoft.WindowsDesktop.App 8.0.0-preview.7.23376.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
          Microsoft.WindowsDesktop.App 8.0.0-rc.1.23420.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

          Other architectures found:
          x86 [C:\Program Files (x86)\dotnet]
          registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

          Environment variables:
          Not set

          global.json file:
          Not found

          Learn more:
          https://aka.ms/dotnet/info

          Download .NET:
          https://aka.ms/dotnet/download

          Expected Behavior

          The Keyed services support should work in the constructor too.

          Steps To Reproduce

          No response

          Exceptions (if any)

          No response

          .NET Version

          8.0.100-rc.1.23455.8

          Anything else?

          dotnet --info

          .NET SDK:
          Version: 8.0.100-rc.1.23455.8
          Commit: e14caf947f

          Runtime Environment:
          OS Name: Windows
          OS Version: 10.0.22621
          OS Platform: Windows
          RID: win-x64
          Base Path: C:\Program Files\dotnet\sdk\8.0.100-rc.1.23455.8\

          .NET workloads installed:
          There are no installed workloads to display.

          Host:
          Version: 8.0.0-rc.1.23419.4
          Architecture: x64
          Commit: 9295993
          RID: win-x64

          .NET SDKs installed:
          6.0.101 [C:\Program Files\dotnet\sdk]
          7.0.102 [C:\Program Files\dotnet\sdk]
          8.0.100-preview.7.23376.3 [C:\Program Files\dotnet\sdk]
          8.0.100-rc.1.23455.8 [C:\Program Files\dotnet\sdk]

          .NET runtimes installed:
          Microsoft.AspNetCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
          Microsoft.AspNetCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
          Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
          Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
          Microsoft.AspNetCore.App 8.0.0-preview.7.23375.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
          Microsoft.AspNetCore.App 8.0.0-rc.1.23421.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
          Microsoft.NETCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
          Microsoft.NETCore.App 6.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
          Microsoft.NETCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
          Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
          Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
          Microsoft.NETCore.App 8.0.0-preview.7.23375.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
          Microsoft.NETCore.App 8.0.0-rc.1.23419.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
          Microsoft.WindowsDesktop.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
          Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
          Microsoft.WindowsDesktop.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
          Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
          Microsoft.WindowsDesktop.App 8.0.0-preview.7.23376.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
          Microsoft.WindowsDesktop.App 8.0.0-rc.1.23420.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

          Other architectures found:
          x86 [C:\Program Files (x86)\dotnet]
          registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

          Environment variables:
          Not set

          global.json file:
          Not found

          Learn more:
          https://aka.ms/dotnet/info

          Download .NET:
          https://aka.ms/dotnet/download

          Metadata

          Metadata

          Assignees

          Type

          No type

          Projects

          No projects

            Milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [FromKeyedServices("keyName")] Keyed services support in Microsoft.Extensions.DependencyInjection is not resolving dependency in constructor · Issue #92076 · dotnet/runtime · GitHub
            Skip to content

            [FromKeyedServices("keyName")] Keyed services support in Microsoft.Extensions.DependencyInjection is not resolving dependency in constructor  #92076

            Description

            @nitish-kaushik

            Is there an existing issue for this?

            • I have searched the existing issues

            Describe the bug

            I am trying the new Support for keyed services in minimal APIs, MVC, and SignalR feature in Asp.Net Core Web API Controller. The dependency works fine when I resolve them directly in the action method of the controller but throws an exception if resolve it in the controller constructor.

            Here is my code:

            public interface IEmployee
            {
            string GetMessage();
            }
            
            public class Employee : IEmployee
            {
            public string GetMessage()
            {
            return "Hello from Employee";
            }
            }
            
            public class TempEmployee : IEmployee
            {
            public string GetMessage()
            {
            return "Hello from Temp Employee";
            }
            }
            

            And this is how I have registered them in the program.cs class.

            builder.Services.AddKeyedSingleton<IEmployee, Employee>("employee");
            builder.Services.AddKeyedSingleton<IEmployee, TempEmployee>("tempEmployee");
            

            Here is the code from the Controller:

            This works fine if resolving the dependency directly in the method

            [HttpGet("temp")]
            public ActionResult GetTempEmployee([FromKeyedServices("tempEmployee")] IEmployee tempEmployee)
            {
            return Ok(tempEmployee.GetMessage());
            }
            

            But If I try to inject this dependency in the constructor then get the error:

            [ApiController]
            [Route("[controller]")]
            public class EmployeeController : ControllerBase
            {
            private readonly IEmployee tempEmployee;
            public EmployeeController([FromKeyedServices("tempEmployee")] IEmployee _tempEmployee)
            {
            tempEmployee = _tempEmployee;
            }
            [HttpGet("temp")]
            public ActionResult GetTempEmployee()
            {
            return Ok(tempEmployee.GetMessage());
            }
            }
            

            Error:

            System.InvalidOperationException: Unable to resolve service for type 'WebApplication5.IEmployee' while attempting to activate 'WebApplication5.Controllers.EmployeeController'.
            at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ThrowHelperUnableToResolveService(Type type, Type requiredBy)
            at lambda_method3(Closure, IServiceProvider, Object[])
            at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
            at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
            at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
            --- End of stack trace from previous location ---
            at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
            at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
            at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
            at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
            at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
            at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
            at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
            at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
            HEADERS
            =======
            Accept: */*
            Host: localhost:7212
            User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
            Accept-Encoding: gzip, deflate, br
            Accept-Language: en-US,en;q=0.9,hi;q=0.8
            Referer: https://localhost:7212/swagger/index.html
            sec-ch-ua: "Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"
            sec-ch-ua-mobile: ?0
            sec-ch-ua-platform: "Windows"
            sec-fetch-site: same-origin
            sec-fetch-mode: cors
            sec-fetch-dest: empty
            

            My System Setup

            Microsoft Visual Studio Enterprise 2022 (64-bit)
            Preview Version 17.8.0 Preview 1.0

            Windows:
            Edition Windows 11 Home Single Language
            Version 22H2
            OS build 22621.2134
            Experience Windows Feature Experience Pack 1000.22659.1000.0

            Output form dotnet --info command

            C:\Users\Nitish>dotnet --info
            .NET SDK:
            Version: 8.0.100-rc.1.23455.8
            Commit: e14caf947f

            Runtime Environment:
            OS Name: Windows
            OS Version: 10.0.22621
            OS Platform: Windows
            RID: win-x64
            Base Path: C:\Program Files\dotnet\sdk\8.0.100-rc.1.23455.8\

            .NET workloads installed:
            There are no installed workloads to display.

            Host:
            Version: 8.0.0-rc.1.23419.4
            Architecture: x64
            Commit: 9295993
            RID: win-x64

            .NET SDKs installed:
            6.0.101 [C:\Program Files\dotnet\sdk]
            7.0.102 [C:\Program Files\dotnet\sdk]
            8.0.100-preview.7.23376.3 [C:\Program Files\dotnet\sdk]
            8.0.100-rc.1.23455.8 [C:\Program Files\dotnet\sdk]

            .NET runtimes installed:
            Microsoft.AspNetCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
            Microsoft.AspNetCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
            Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
            Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
            Microsoft.AspNetCore.App 8.0.0-preview.7.23375.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
            Microsoft.AspNetCore.App 8.0.0-rc.1.23421.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
            Microsoft.NETCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
            Microsoft.NETCore.App 6.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
            Microsoft.NETCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
            Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
            Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
            Microsoft.NETCore.App 8.0.0-preview.7.23375.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
            Microsoft.NETCore.App 8.0.0-rc.1.23419.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
            Microsoft.WindowsDesktop.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
            Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
            Microsoft.WindowsDesktop.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
            Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
            Microsoft.WindowsDesktop.App 8.0.0-preview.7.23376.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
            Microsoft.WindowsDesktop.App 8.0.0-rc.1.23420.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

            Other architectures found:
            x86 [C:\Program Files (x86)\dotnet]
            registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

            Environment variables:
            Not set

            global.json file:
            Not found

            Learn more:
            https://aka.ms/dotnet/info

            Download .NET:
            https://aka.ms/dotnet/download

            Expected Behavior

            The Keyed services support should work in the constructor too.

            Steps To Reproduce

            No response

            Exceptions (if any)

            No response

            .NET Version

            8.0.100-rc.1.23455.8

            Anything else?

            dotnet --info

            .NET SDK:
            Version: 8.0.100-rc.1.23455.8
            Commit: e14caf947f

            Runtime Environment:
            OS Name: Windows
            OS Version: 10.0.22621
            OS Platform: Windows
            RID: win-x64
            Base Path: C:\Program Files\dotnet\sdk\8.0.100-rc.1.23455.8\

            .NET workloads installed:
            There are no installed workloads to display.

            Host:
            Version: 8.0.0-rc.1.23419.4
            Architecture: x64
            Commit: 9295993
            RID: win-x64

            .NET SDKs installed:
            6.0.101 [C:\Program Files\dotnet\sdk]
            7.0.102 [C:\Program Files\dotnet\sdk]
            8.0.100-preview.7.23376.3 [C:\Program Files\dotnet\sdk]
            8.0.100-rc.1.23455.8 [C:\Program Files\dotnet\sdk]

            .NET runtimes installed:
            Microsoft.AspNetCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
            Microsoft.AspNetCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
            Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
            Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
            Microsoft.AspNetCore.App 8.0.0-preview.7.23375.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
            Microsoft.AspNetCore.App 8.0.0-rc.1.23421.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
            Microsoft.NETCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
            Microsoft.NETCore.App 6.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
            Microsoft.NETCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
            Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
            Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
            Microsoft.NETCore.App 8.0.0-preview.7.23375.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
            Microsoft.NETCore.App 8.0.0-rc.1.23419.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
            Microsoft.WindowsDesktop.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
            Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
            Microsoft.WindowsDesktop.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
            Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
            Microsoft.WindowsDesktop.App 8.0.0-preview.7.23376.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
            Microsoft.WindowsDesktop.App 8.0.0-rc.1.23420.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

            Other architectures found:
            x86 [C:\Program Files (x86)\dotnet]
            registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

            Environment variables:
            Not set

            global.json file:
            Not found

            Learn more:
            https://aka.ms/dotnet/info

            Download .NET:
            https://aka.ms/dotnet/download

            Metadata

            Metadata

            Assignees

            Type

            No type

            Projects

            No projects

              Milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [FromKeyedServices("keyName")] Keyed services support in Microsoft.Extensions.DependencyInjection is not resolving dependency in constructor · Issue #92076 · dotnet/runtime · GitHub
              Skip to content

              [FromKeyedServices("keyName")] Keyed services support in Microsoft.Extensions.DependencyInjection is not resolving dependency in constructor  #92076

              Description

              @nitish-kaushik

              Is there an existing issue for this?

              • I have searched the existing issues

              Describe the bug

              I am trying the new Support for keyed services in minimal APIs, MVC, and SignalR feature in Asp.Net Core Web API Controller. The dependency works fine when I resolve them directly in the action method of the controller but throws an exception if resolve it in the controller constructor.

              Here is my code:

              public interface IEmployee
              {
              string GetMessage();
              }
              
              public class Employee : IEmployee
              {
              public string GetMessage()
              {
              return "Hello from Employee";
              }
              }
              
              public class TempEmployee : IEmployee
              {
              public string GetMessage()
              {
              return "Hello from Temp Employee";
              }
              }
              

              And this is how I have registered them in the program.cs class.

              builder.Services.AddKeyedSingleton<IEmployee, Employee>("employee");
              builder.Services.AddKeyedSingleton<IEmployee, TempEmployee>("tempEmployee");
              

              Here is the code from the Controller:

              This works fine if resolving the dependency directly in the method

              [HttpGet("temp")]
              public ActionResult GetTempEmployee([FromKeyedServices("tempEmployee")] IEmployee tempEmployee)
              {
              return Ok(tempEmployee.GetMessage());
              }
              

              But If I try to inject this dependency in the constructor then get the error:

              [ApiController]
              [Route("[controller]")]
              public class EmployeeController : ControllerBase
              {
              private readonly IEmployee tempEmployee;
              public EmployeeController([FromKeyedServices("tempEmployee")] IEmployee _tempEmployee)
              {
              tempEmployee = _tempEmployee;
              }
              [HttpGet("temp")]
              public ActionResult GetTempEmployee()
              {
              return Ok(tempEmployee.GetMessage());
              }
              }
              

              Error:

              System.InvalidOperationException: Unable to resolve service for type 'WebApplication5.IEmployee' while attempting to activate 'WebApplication5.Controllers.EmployeeController'.
              at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ThrowHelperUnableToResolveService(Type type, Type requiredBy)
              at lambda_method3(Closure, IServiceProvider, Object[])
              at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
              at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
              at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
              --- End of stack trace from previous location ---
              at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
              at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
              at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
              at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
              at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
              at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
              at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
              at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
              HEADERS
              =======
              Accept: */*
              Host: localhost:7212
              User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
              Accept-Encoding: gzip, deflate, br
              Accept-Language: en-US,en;q=0.9,hi;q=0.8
              Referer: https://localhost:7212/swagger/index.html
              sec-ch-ua: "Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"
              sec-ch-ua-mobile: ?0
              sec-ch-ua-platform: "Windows"
              sec-fetch-site: same-origin
              sec-fetch-mode: cors
              sec-fetch-dest: empty
              

              My System Setup

              Microsoft Visual Studio Enterprise 2022 (64-bit)
              Preview Version 17.8.0 Preview 1.0

              Windows:
              Edition Windows 11 Home Single Language
              Version 22H2
              OS build 22621.2134
              Experience Windows Feature Experience Pack 1000.22659.1000.0

              Output form dotnet --info command

              C:\Users\Nitish>dotnet --info
              .NET SDK:
              Version: 8.0.100-rc.1.23455.8
              Commit: e14caf947f

              Runtime Environment:
              OS Name: Windows
              OS Version: 10.0.22621
              OS Platform: Windows
              RID: win-x64
              Base Path: C:\Program Files\dotnet\sdk\8.0.100-rc.1.23455.8\

              .NET workloads installed:
              There are no installed workloads to display.

              Host:
              Version: 8.0.0-rc.1.23419.4
              Architecture: x64
              Commit: 9295993
              RID: win-x64

              .NET SDKs installed:
              6.0.101 [C:\Program Files\dotnet\sdk]
              7.0.102 [C:\Program Files\dotnet\sdk]
              8.0.100-preview.7.23376.3 [C:\Program Files\dotnet\sdk]
              8.0.100-rc.1.23455.8 [C:\Program Files\dotnet\sdk]

              .NET runtimes installed:
              Microsoft.AspNetCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
              Microsoft.AspNetCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
              Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
              Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
              Microsoft.AspNetCore.App 8.0.0-preview.7.23375.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
              Microsoft.AspNetCore.App 8.0.0-rc.1.23421.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
              Microsoft.NETCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
              Microsoft.NETCore.App 6.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
              Microsoft.NETCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
              Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
              Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
              Microsoft.NETCore.App 8.0.0-preview.7.23375.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
              Microsoft.NETCore.App 8.0.0-rc.1.23419.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
              Microsoft.WindowsDesktop.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
              Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
              Microsoft.WindowsDesktop.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
              Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
              Microsoft.WindowsDesktop.App 8.0.0-preview.7.23376.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
              Microsoft.WindowsDesktop.App 8.0.0-rc.1.23420.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

              Other architectures found:
              x86 [C:\Program Files (x86)\dotnet]
              registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

              Environment variables:
              Not set

              global.json file:
              Not found

              Learn more:
              https://aka.ms/dotnet/info

              Download .NET:
              https://aka.ms/dotnet/download

              Expected Behavior

              The Keyed services support should work in the constructor too.

              Steps To Reproduce

              No response

              Exceptions (if any)

              No response

              .NET Version

              8.0.100-rc.1.23455.8

              Anything else?

              dotnet --info

              .NET SDK:
              Version: 8.0.100-rc.1.23455.8
              Commit: e14caf947f

              Runtime Environment:
              OS Name: Windows
              OS Version: 10.0.22621
              OS Platform: Windows
              RID: win-x64
              Base Path: C:\Program Files\dotnet\sdk\8.0.100-rc.1.23455.8\

              .NET workloads installed:
              There are no installed workloads to display.

              Host:
              Version: 8.0.0-rc.1.23419.4
              Architecture: x64
              Commit: 9295993
              RID: win-x64

              .NET SDKs installed:
              6.0.101 [C:\Program Files\dotnet\sdk]
              7.0.102 [C:\Program Files\dotnet\sdk]
              8.0.100-preview.7.23376.3 [C:\Program Files\dotnet\sdk]
              8.0.100-rc.1.23455.8 [C:\Program Files\dotnet\sdk]

              .NET runtimes installed:
              Microsoft.AspNetCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
              Microsoft.AspNetCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
              Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
              Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
              Microsoft.AspNetCore.App 8.0.0-preview.7.23375.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
              Microsoft.AspNetCore.App 8.0.0-rc.1.23421.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
              Microsoft.NETCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
              Microsoft.NETCore.App 6.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
              Microsoft.NETCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
              Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
              Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
              Microsoft.NETCore.App 8.0.0-preview.7.23375.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
              Microsoft.NETCore.App 8.0.0-rc.1.23419.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
              Microsoft.WindowsDesktop.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
              Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
              Microsoft.WindowsDesktop.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
              Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
              Microsoft.WindowsDesktop.App 8.0.0-preview.7.23376.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
              Microsoft.WindowsDesktop.App 8.0.0-rc.1.23420.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

              Other architectures found:
              x86 [C:\Program Files (x86)\dotnet]
              registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

              Environment variables:
              Not set

              global.json file:
              Not found

              Learn more:
              https://aka.ms/dotnet/info

              Download .NET:
              https://aka.ms/dotnet/download

              Metadata

              Metadata

              Assignees

              Type

              No type

              Projects

              No projects

                Milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); [FromKeyedServices("keyName")] Keyed services support in Microsoft.Extensions.DependencyInjection is not resolving dependency in constructor · Issue #92076 · dotnet/runtime · GitHub
                Skip to content

                [FromKeyedServices("keyName")] Keyed services support in Microsoft.Extensions.DependencyInjection is not resolving dependency in constructor  #92076

                Description

                @nitish-kaushik

                Is there an existing issue for this?

                • I have searched the existing issues

                Describe the bug

                I am trying the new Support for keyed services in minimal APIs, MVC, and SignalR feature in Asp.Net Core Web API Controller. The dependency works fine when I resolve them directly in the action method of the controller but throws an exception if resolve it in the controller constructor.

                Here is my code:

                public interface IEmployee
                {
                string GetMessage();
                }
                
                public class Employee : IEmployee
                {
                public string GetMessage()
                {
                return "Hello from Employee";
                }
                }
                
                public class TempEmployee : IEmployee
                {
                public string GetMessage()
                {
                return "Hello from Temp Employee";
                }
                }
                

                And this is how I have registered them in the program.cs class.

                builder.Services.AddKeyedSingleton<IEmployee, Employee>("employee");
                builder.Services.AddKeyedSingleton<IEmployee, TempEmployee>("tempEmployee");
                

                Here is the code from the Controller:

                This works fine if resolving the dependency directly in the method

                [HttpGet("temp")]
                public ActionResult GetTempEmployee([FromKeyedServices("tempEmployee")] IEmployee tempEmployee)
                {
                return Ok(tempEmployee.GetMessage());
                }
                

                But If I try to inject this dependency in the constructor then get the error:

                [ApiController]
                [Route("[controller]")]
                public class EmployeeController : ControllerBase
                {
                private readonly IEmployee tempEmployee;
                public EmployeeController([FromKeyedServices("tempEmployee")] IEmployee _tempEmployee)
                {
                tempEmployee = _tempEmployee;
                }
                [HttpGet("temp")]
                public ActionResult GetTempEmployee()
                {
                return Ok(tempEmployee.GetMessage());
                }
                }
                

                Error:

                System.InvalidOperationException: Unable to resolve service for type 'WebApplication5.IEmployee' while attempting to activate 'WebApplication5.Controllers.EmployeeController'.
                at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ThrowHelperUnableToResolveService(Type type, Type requiredBy)
                at lambda_method3(Closure, IServiceProvider, Object[])
                at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
                at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
                at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
                --- End of stack trace from previous location ---
                at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
                at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
                at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
                at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
                at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
                at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
                at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
                at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
                HEADERS
                =======
                Accept: */*
                Host: localhost:7212
                User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
                Accept-Encoding: gzip, deflate, br
                Accept-Language: en-US,en;q=0.9,hi;q=0.8
                Referer: https://localhost:7212/swagger/index.html
                sec-ch-ua: "Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"
                sec-ch-ua-mobile: ?0
                sec-ch-ua-platform: "Windows"
                sec-fetch-site: same-origin
                sec-fetch-mode: cors
                sec-fetch-dest: empty
                

                My System Setup

                Microsoft Visual Studio Enterprise 2022 (64-bit)
                Preview Version 17.8.0 Preview 1.0

                Windows:
                Edition Windows 11 Home Single Language
                Version 22H2
                OS build 22621.2134
                Experience Windows Feature Experience Pack 1000.22659.1000.0

                Output form dotnet --info command

                C:\Users\Nitish>dotnet --info
                .NET SDK:
                Version: 8.0.100-rc.1.23455.8
                Commit: e14caf947f

                Runtime Environment:
                OS Name: Windows
                OS Version: 10.0.22621
                OS Platform: Windows
                RID: win-x64
                Base Path: C:\Program Files\dotnet\sdk\8.0.100-rc.1.23455.8\

                .NET workloads installed:
                There are no installed workloads to display.

                Host:
                Version: 8.0.0-rc.1.23419.4
                Architecture: x64
                Commit: 9295993
                RID: win-x64

                .NET SDKs installed:
                6.0.101 [C:\Program Files\dotnet\sdk]
                7.0.102 [C:\Program Files\dotnet\sdk]
                8.0.100-preview.7.23376.3 [C:\Program Files\dotnet\sdk]
                8.0.100-rc.1.23455.8 [C:\Program Files\dotnet\sdk]

                .NET runtimes installed:
                Microsoft.AspNetCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
                Microsoft.AspNetCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
                Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
                Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
                Microsoft.AspNetCore.App 8.0.0-preview.7.23375.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
                Microsoft.AspNetCore.App 8.0.0-rc.1.23421.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
                Microsoft.NETCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
                Microsoft.NETCore.App 6.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
                Microsoft.NETCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
                Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
                Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
                Microsoft.NETCore.App 8.0.0-preview.7.23375.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
                Microsoft.NETCore.App 8.0.0-rc.1.23419.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
                Microsoft.WindowsDesktop.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
                Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
                Microsoft.WindowsDesktop.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
                Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
                Microsoft.WindowsDesktop.App 8.0.0-preview.7.23376.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
                Microsoft.WindowsDesktop.App 8.0.0-rc.1.23420.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

                Other architectures found:
                x86 [C:\Program Files (x86)\dotnet]
                registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

                Environment variables:
                Not set

                global.json file:
                Not found

                Learn more:
                https://aka.ms/dotnet/info

                Download .NET:
                https://aka.ms/dotnet/download

                Expected Behavior

                The Keyed services support should work in the constructor too.

                Steps To Reproduce

                No response

                Exceptions (if any)

                No response

                .NET Version

                8.0.100-rc.1.23455.8

                Anything else?

                dotnet --info

                .NET SDK:
                Version: 8.0.100-rc.1.23455.8
                Commit: e14caf947f

                Runtime Environment:
                OS Name: Windows
                OS Version: 10.0.22621
                OS Platform: Windows
                RID: win-x64
                Base Path: C:\Program Files\dotnet\sdk\8.0.100-rc.1.23455.8\

                .NET workloads installed:
                There are no installed workloads to display.

                Host:
                Version: 8.0.0-rc.1.23419.4
                Architecture: x64
                Commit: 9295993
                RID: win-x64

                .NET SDKs installed:
                6.0.101 [C:\Program Files\dotnet\sdk]
                7.0.102 [C:\Program Files\dotnet\sdk]
                8.0.100-preview.7.23376.3 [C:\Program Files\dotnet\sdk]
                8.0.100-rc.1.23455.8 [C:\Program Files\dotnet\sdk]

                .NET runtimes installed:
                Microsoft.AspNetCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
                Microsoft.AspNetCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
                Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
                Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
                Microsoft.AspNetCore.App 8.0.0-preview.7.23375.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
                Microsoft.AspNetCore.App 8.0.0-rc.1.23421.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
                Microsoft.NETCore.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
                Microsoft.NETCore.App 6.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
                Microsoft.NETCore.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
                Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
                Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
                Microsoft.NETCore.App 8.0.0-preview.7.23375.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
                Microsoft.NETCore.App 8.0.0-rc.1.23419.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
                Microsoft.WindowsDesktop.App 6.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
                Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
                Microsoft.WindowsDesktop.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
                Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
                Microsoft.WindowsDesktop.App 8.0.0-preview.7.23376.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
                Microsoft.WindowsDesktop.App 8.0.0-rc.1.23420.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

                Other architectures found:
                x86 [C:\Program Files (x86)\dotnet]
                registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

                Environment variables:
                Not set

                global.json file:
                Not found

                Learn more:
                https://aka.ms/dotnet/info

                Download .NET:
                https://aka.ms/dotnet/download

                Metadata

                Metadata

                Assignees

                Type

                No type

                Projects

                No projects

                  Milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions