次の方法で共有


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 の両方で同じ動作になります。 アプリケーションが古い動作に依存している場合は、.NET 8.0.9 (.NET 9 ではありません) に Microsoft.Extensions.DependencyInjection.AllowNonKeyedServiceInjectという名前の機能スイッチが追加されました。 以前の動作を維持するには、スイッチを true に設定します。

影響を受ける API