ActivatorUtilities.CreateInstance bereaksi secara konsisten

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.

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.

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

Lihat juga