在 .NET 8 中使用 AddKeyedScoped 注册带有键值的服务时,可能会遇到一些常见的问题。以下是一些常见的错误以及相应的解决方案:
AddKeyedScoped
服务未注册: 确保你已正确注册服务。例如:
services.AddKeyedScoped<MyService>(key1, provider => new MyService());
获取服务时的键值错误: 在解析服务时,确保使用了正确的键值。例如:
var myService = serviceProvider.GetRequiredService<IKeyedService<MyService>>().GetService(key1);
键值类型不匹配: 确保键值的类型匹配。例如,如果你使用字符串作为键值:
services.AddKeyedScoped<MyService, string>("myKey", provider => new MyService());
在获取服务时:
var myService = serviceProvider.GetRequiredService<IKeyedService<MyService, string>>().GetService("myKey");
生命周期冲突: 确保服务的生命周期与其依赖项的生命周期兼容。Scoped 服务依赖于 Singleton 服务时可能会引发问题。
Scoped
Singleton
版本不兼容: 确保你使用的是 .NET 8,并且所有相关包都是最新版本。某些特性可能在较旧版本中不可用或行为不同。
未找到合适的扩展方法: 确保你已包含适当的命名空间:
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