FromKeyedServicesAttribute 不再注入非键化参数
使用 FromKeyedServicesAttribute 指定要注入的键控服务时,可能会传递不正确的服务。
旧行为
以前,如果键控服务旨在通过使用 FromKeyedServicesAttribute 作为参数注入服务构造函数中,并且相应的键控服务(以下示例中的 service1
)未注册为键控服务,但注册为非键控服务类型(以下示例中的 IService
),则注入非键控服务,而不是引发异常。
public MyService([FromKeyedServices("service1")] IService service1, ...
新行为
从 .NET 9 开始,使用 FromKeyedServicesAttribute 时会引发 InvalidOperationException,并且找不到指定的键控服务。 当由于注册不足而找不到请求的服务时,此行为与其他情况一致。
引入的版本
.NET 9 RC 1 和 8.0.9 服务
中断性变更的类型
此更改为行为更改。
更改原因
此更改添加缺少的验证逻辑来检测服务配置错误 bug。 在 v8.0 中添加键控服务功能时,存在此问题。
建议的操作
如果使用 FromKeyedServicesAttribute
,请确保相应的服务注册为键控服务,例如使用 IServiceCollection.AddKeyedScoped()
、IServiceCollection.AddKeyedSingleton()
或 IServiceCollection.AddKeyedTransient()
。
修补程序也已向后移植到了 .NET 8.0.9,因此 .NET 8 和 .NET 9 的行为都相同。 如果应用程序依赖于旧行为,则为名为 Microsoft.Extensions.DependencyInjection.AllowNonKeyedServiceInject
的 .NET 8.0.9(但不是 .NET 9)添加了功能切换。 将切换设置为 true
以保留旧行为。