Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
- Eğer herhangi bir oluşturucu bulunmazsa ve IServiceProviderIsService mevcut değilse, mantık CreateFactory(Type, Type[]) mantığına geri döner.
- Birden fazla oluşturucu bulursa, bir InvalidOperationExceptionoluşturur.
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.
Önerilen eylem
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
- Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance<T>(IServiceProvider, Object[])
- Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider, Type, Object[])