FromKeyedServicesAttribute 不再插入非索引鍵參數
當您使用 FromKeyedServicesAttribute 來指定要插入的索引鍵服務時,可能會傳遞不正確的服務。
先前的行為
先前,當索引鍵服務是用來使用 FromKeyedServicesAttribute 在服務建構函式中做為參數插入,且對應的索引鍵服務 (service1
在下列範例中) 未註冊為索引鍵服務,但被註冊為非索引服務類型 (IService
在下列範例中),則會插入非索引鍵服務,而不是擲回例外狀況。
public MyService([FromKeyedServices("service1")] IService service1, ...
新的行為
從 .NET 9 開始,當使用了 FromKeyedServicesAttribute 而且找不到指定的索引鍵服務,就會擲回 InvalidOperationException。 當因為缺少註冊而找不到要求的服務時,此行為與其他案例一致。
導入的版本
.NET 9 RC 1 和 8.0.9 服務
中斷性變更的類型
此變更為行為變更。
變更原因
這項變更會新增遺漏的驗證邏輯,以偵測服務設定錯誤的錯誤。 在 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
以保留舊的行為。