Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 menggunakanKeyedService.AnyKeysebagai kunci pencarian. -
GetKeyedServices()(jamak) tidak akan mengembalikanAnyKeyregistrasi saat dikueri denganKeyedService.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
AnyKeydiperlakukan sebagai kasus khusus dan tidak dapat digunakan untuk menyelesaikan satu layanan. - Cegah
GetKeyedServices()agar tidak mengembalikanAnyKeypendaftaran saat dikueri denganAnyKey.
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.
Tindakan yang direkomendasikan
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
- Microsoft.Extensions.DependencyInjection.ServiceProviderKeyedServiceExtensions.GetKeyedService(IServiceProvider, Type, Object)
- Microsoft.Extensions.DependencyInjection.ServiceProviderKeyedServiceExtensions.GetKeyedServices(IServiceProvider, Type, Object)