Aracılığıyla paylaş


ActivatorUtilities.CreateInstance tutarlı bir şekilde davranır

ActivatorUtilities.CreateInstance'nün davranışı artık CreateFactory(Type, Type[]) ile daha tutarlıdır. Bağımlılık ekleme (DI) kapsayıcısında IServiceProviderIsService mevcut olmadığında, CreateInstance, CreateFactory(Type, Type[]) mantığına geri döner. Bu mantıkta, sağlanan tüm giriş parametreleriyle yalnızca bir oluşturucunun eşleşmesine izin verilir.

Daha genel bir durumda, IServiceProviderIsService mevcut olduğunda, CreateInstance API, tüm bağımsız değişkenleri kullanılabilir olan en uzun oluşturucu aşırı yüklemesini tercih eder. Bağımsız değişkenler API'ye aktarılabilir, container'a kaydedilebilir veya oluşturucuya ait varsayılan değerlerden erişilebilir.

İki oluşturucuyu gösteren aşağıdaki sınıf tanımını göz önünde bulundurun:

public class A
{
   A(B b, C c, string st = "default string") { }
   A() { }
}

Bu sınıf tanımı için ve IServiceProviderIsService mevcut olduğunda, ActivatorUtilities.CreateInstance<A>(serviceProvider, new C()), A, B, ve C alan ilk oluşturucuyu seçerek string ile örneklendirir.

Sürüm kullanıma sunulmuştur

.NET 8 Preview 1

Önceki davranış

ActivatorUtilities.CreateInstance bazı durumlarda beklenmedik şekilde davrandı. Bu, ona geçirilen tüm gerekli örneklerin seçilen oluşturucuda mevcut olduğundan emin oldu. Ancak oluşturucu seçimi hatalıydı ve güvenilir değildi.

Yeni davranış

CreateInstance , davranışına IServiceProviderIsServicegöre tüm parametrelerle eşleşen en uzun oluşturucuyu bulmaya çalışır.

Uyarı

Eğer IServiceProviderIsService yanlış yapılandırılmış veya mevcut değilse, CreateInstance doğru çalışmayabilir ya da işlevi belirsiz olabilir.

Kesinti yaratan değişiklik türü

Bu değişiklik davranışsal bir değişikliktir.

Değişiklik nedeni

Bu değişiklik, oluşturucu aşırı yükleme tanımlarının sırasına bağlı olarak davranışın değiştiği bir hatayı düzeltmek için sunulmuştur.

Uygulamanız farklı davranmaya başlarsa veya .NET 8'e yükselttikten sonra bir özel durum oluşturursa, etkilenen örnek türü için oluşturucu tanımlarını dikkatlice inceleyin. Yeni davranış bölümüne bakın.

Etkilenen API'ler

Ayrıca bakınız