Bagikan melalui


Memperbaiki masalah di GetKeyedService() dan GetKeyedServices() dengan AnyKey

Perilaku metode GetKeyedService(IServiceProvider, Type, Object) dan GetKeyedServices(IServiceProvider, Type, Object) dalam pustaka Microsoft.Extensions.DependencyInjection diperbarui untuk mengatasi inkonsistensi dalam penanganan registrasi KeyedService.AnyKey. Khususnya:

  • GetKeyedService() sekarang melemparkan pengecualian ketika Anda mencoba menyelesaikan satu layanan menggunakan KeyedService.AnyKey sebagai kunci pencarian.
  • GetKeyedServices() (jamak) tidak akan mengembalikan AnyKey registrasi saat dikueri dengan KeyedService.AnyKey.

Versi yang diperkenalkan

.NET 10

Perilaku sebelumnya

Sebelumnya, memanggil GetKeyedService() dengan KeyedService.AnyKey mengembalikan pendaftaran layanan yang terkait dengan AnyKey. Perilaku ini tidak konsisten dengan semantik yang dimaksudkan, karena AnyKey dimaksudkan untuk mewakili kasus khusus dari layanan yang menggunakan kunci daripada pendaftaran tertentu.

Memanggil GetKeyedServices() dengan KeyedService.AnyKey mengembalikan semua pendaftaran untuk AnyKey. Perilaku ini juga tidak konsisten dengan semantik yang dimaksudkan, karena AnyKey tidak dimaksudkan untuk merinci semua layanan yang diidentifikasi dengan kunci.

Perilaku baru

Mulai dari .NET 10, memanggil GetKeyedService() dengan KeyedService.AnyKey menghasilkan InvalidOperationException. Ini memastikan bahwa AnyKey tidak dapat digunakan untuk menyelesaikan satu layanan, karena dimaksudkan untuk mewakili kasus khusus daripada kunci tertentu.

var service = serviceProvider.GetKeyedService(typeof(IMyService), KeyedService.AnyKey);
// Throws InvalidOperationException: "Cannot resolve a single service using AnyKey."

Selain itu, memanggil GetKeyedServices() dengan KeyedService.AnyKey tidak lagi mengembalikan pendaftaran untuk AnyKey. Sebaliknya, ia mematuhi semantik yang diperbarui di mana AnyKey diperlakukan sebagai kasus khusus dan tidak menghitung layanan.

var services = serviceProvider.GetKeyedServices(typeof(IMyService), KeyedService.AnyKey);
// Returns only services that were registered with a specific key.

Jenis perubahan yang memutus kompatibilitas

Perubahan ini adalah perubahan perilaku.

Alasan perubahan

Perilaku GetKeyedService() dan GetKeyedServices() sebelumnya dengan KeyedService.AnyKey tidak konsisten dengan semantik yang dimaksudkan dari AnyKey. Perubahan diperkenalkan pada:

  • Pastikan bahwa AnyKey diperlakukan sebagai kasus khusus dan tidak dapat digunakan untuk menyelesaikan satu layanan.
  • Cegah GetKeyedServices() agar tidak mengembalikan AnyKey pendaftaran saat dikueri dengan AnyKey.

Pembaruan ini meningkatkan prediktabilitas dan ketepatan perilaku pustaka saat bekerja dengan layanan yang menggunakan kunci. Untuk detail selengkapnya, lihat permintaan pull dan penerapan penggabungan terkait.

Jika Anda menggunakan GetKeyedService() atau GetKeyedServices() dengan KeyedService.AnyKey, tinjau kode Anda dan perbarui untuk menggunakan kunci tertentu alih-alih AnyKey:

  • Perbarui pemanggilan GetKeyedService(KeyedService.AnyKey) untuk meneruskan kunci tertentu, atau gunakan logika alternatif untuk menangani resolusi layanan.
  • Perbarui GetKeyedServices(KeyedService.AnyKey) panggilan untuk meneruskan kunci tertentu, atau gunakan logika alternatif untuk menyusun daftar hanya layanan yang ingin Anda peroleh.

API yang terpengaruh

Lihat juga