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 ActivatorUtilities.CreateInstance sekarang lebih konsisten dengan CreateFactory(Type, Type[]). Ketika IServiceProviderIsService tidak ada dalam kontainer injeksi dependensi (DI), CreateInstance kembali ke logika CreateFactory(Type, Type[]) yang sudah ditentukan. Dalam logika tersebut, hanya satu konstruktor yang diizinkan untuk mencocokkan dengan semua parameter input yang disediakan.
Dalam kasus yang lebih umum ketika IServiceProviderIsService ada, CreateInstance API lebih mengutamakan overload konstruktor terpanjang yang memiliki semua argumen tersedia. Argumen dapat dimasukkan ke API, terdaftar dalam kontainer, atau tersedia dari nilai default di konstruktor itu sendiri.
Pertimbangkan definisi kelas berikut yang menunjukkan dua konstruktor:
public class A
{
A(B b, C c, string st = "default string") { }
A() { }
}
Untuk definisi kelas ini, dan ketika IServiceProviderIsService ada, ActivatorUtilities.CreateInstance<A>(serviceProvider, new C()) menginstansiasi A dengan memilih konstruktor pertama yang mengambil B, C, dan string.
Versi yang diperkenalkan
Pratinjau .NET 8 1
Perilaku sebelumnya
ActivatorUtilities.CreateInstance berperilaku tak terduga dalam beberapa kasus. Ini memastikan semua instans yang diperlukan sudah ada sebelum diteruskan ke konstruktor yang dipilih. Namun, pemilihan konstruktor bermasalah dan tidak dapat diandalkan.
Perilaku baru
CreateInstance mencoba menemukan konstruktor terpanjang yang cocok dengan semua parameter berdasarkan perilaku IServiceProviderIsService.
- Jika tidak ada konstruktor yang ditemukan atau jika IServiceProviderIsService tidak ada, akan menggunakan logika CreateFactory(Type, Type[]) sebagai cadangan.
- Jika menemukan lebih dari satu konstruktor, akan melempar InvalidOperationException.
Nota
Jika IServiceProviderIsService dikonfigurasi dengan salah atau tidak ada, CreateInstance mungkin berfungsi dengan tidak benar atau ambigu.
Jenis perubahan yang memutus kompatibilitas
Perubahan ini adalah perubahan perilaku .
Alasan perubahan
Perubahan ini diperkenalkan untuk memperbaiki bug di mana perilaku berubah tergantung pada urutan definisi kelebihan beban konstruktor.
Tindakan yang direkomendasikan
Jika aplikasi Anda mulai berperilaku berbeda atau melemparkan pengecualian setelah meningkatkan ke .NET 8, periksa dengan cermat definisi konstruktor untuk jenis instans yang terpengaruh. Lihat bagian Perilaku baru .
API yang terpengaruh
- Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance<T>(IServiceProvider, Object[])
- Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider, Type, Object[])