2020-05-26 01:07:59
.NET 8 的键控服务依赖注入(Keyed Dependency Injection)是一种允许为同一接口注册多个实现,并通过唯一键(Key)解析特定实现的功能,解决了传统依赖注入中接口单一实现的局限性。
一、核心功能解析问题背景在传统依赖注入中,若一个接口有多个实现类,直接注册会导致冲突(如 IServiceCollection 默认只允许最后一个注册的实现生效)。键控服务依赖注入通过引入唯一键(如字符串、枚举等)区分不同实现,实现按需解析。
关键特性
多实现共存:同一接口可注册多个实现,每个实现绑定独立键。
运行时解析:通过 IServiceProvider 根据键动态获取目标实现。
生命周期支持:兼容 Singleton、Scoped、Transient 三种生命周期。
在 Program.cs 中使用 AddKeyedSingleton(或其他生命周期方法)注册实现:
var builder = WebApplication.CreateBuilder(args);builder.Services.AddKeyedSingleton<IStorage, LocalStorage>("Local");builder.Services.AddKeyedSingleton<IStorage, CloudStorage>("Cloud");3. 解析服务并调用通过 IServiceProvider 按键解析服务:
app.MapGet("/test", (IServiceProvider provider) => { var localStorage = provider.GetRequiredKeyedService<IStorage>("Local"); localStorage.StoreData("测试数据1"); var cloudStorage = provider.GetRequiredKeyedService<IStorage>("Cloud"); cloudStorage.StoreData("测试数据2");});图:控制台输出不同实现的执行结果三、与.NET 7的兼容性多策略选择例如支付系统中,根据用户选择调用 AlipayService(键 "Alipay")或 WeChatPayService(键 "WeChat")。
插件化架构通过键动态加载不同插件实现,无需修改主程序逻辑。
测试隔离在单元测试中,为同一接口注册模拟实现(键 "Mock")和真实实现(键 "Real"),按需切换。
.NET 8 的键控服务依赖注入通过引入键值对机制,显著提升了依赖注入的灵活性,尤其适合需要动态选择实现的场景。其设计简洁且与现有 DI 容器无缝集成,是构建模块化、可扩展应用的重要工具。建议开发者在.NET 8 项目中优先采用此模式替代传统的 IFactory 或条件注册方案。