.Net8 AddKeyedScoped键值key注册服务异常


在 .NET 8 中使用 AddKeyedScoped 注册带有键值的服务时,可能会遇到一些常见的问题。以下是一些常见的错误以及相应的解决方案:

  1. 服务未注册: 确保你已正确注册服务。例如:

    services.AddKeyedScoped<MyService>(key1, provider => new MyService());
    
  2. 获取服务时的键值错误: 在解析服务时,确保使用了正确的键值。例如:

    var myService = serviceProvider.GetRequiredService<IKeyedService<MyService>>().GetService(key1);
    
  3. 键值类型不匹配: 确保键值的类型匹配。例如,如果你使用字符串作为键值:

    services.AddKeyedScoped<MyService, string>("myKey", provider => new MyService());
    

    在获取服务时:

    var myService = serviceProvider.GetRequiredService<IKeyedService<MyService, string>>().GetService("myKey");
    
  4. 生命周期冲突: 确保服务的生命周期与其依赖项的生命周期兼容。Scoped 服务依赖于 Singleton 服务时可能会引发问题。

  5. 版本不兼容: 确保你使用的是 .NET 8,并且所有相关包都是最新版本。某些特性可能在较旧版本中不可用或行为不同。

  6. 未找到合适的扩展方法: 确保你已包含适当的命名空间:

    using Microsoft.Extensions.DependencyInjection;
    

示例代码

注册带有键值的服务:

public interface IMyService
{
    void DoWork();
}

public class MyService1 : IMyService
{
    public void DoWork() => Console.WriteLine("MyService1 is doing work.");
}

public class MyService2 : IMyService
{
    public void DoWork() => Console.WriteLine("MyService2 is doing work.");
}

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddKeyedScoped<IMyService, string>("Service1", provider => new MyService1());
        services.AddKeyedScoped<IMyService, string>("Service2", provider => new MyService2());
    }
}

解析带有键值的服务:

public class MyComponent
{
    private readonly IKeyedService<IMyService, string> _keyedService;

    public MyComponent(IKeyedService<IMyService, string> keyedService)
    {
        _keyedService = keyedService;
    }

    public void Execute()
    {
        var service1 = _keyedService.GetService("Service1");
        service1.DoWork();

        var service2 = _keyedService.GetService("Service2");
        service2.DoWork();
    }
}

通过以上方法,你应该能够成功注册和解析带有键值的服务。如果问题依然存在,请提供更多详细信息,如异常信息、代码片段等,以便进一步排查问题。


原文链接:codingdict.net