ActivatorUtilities.CreateInstance работает последовательно

Поведение ActivatorUtilities.CreateInstance теперь более согласовано с CreateFactory(Type, Type[]). Если IServiceProviderIsService отсутствует в контейнере внедрения зависимостей (DI), CreateInstance переходит к логике CreateFactory(Type, Type[]). В этой логике только один конструктор может соответствовать всем предоставленным входным параметрам.

В более общем случае, когда IServiceProviderIsService присутствует, CreateInstance API предпочитает самую длинную перегрузку конструктора, которая имеет все доступные аргументы. Аргументы могут быть входными данными в API, зарегистрированными в контейнере или доступными из значений по умолчанию в самом конструкторе.

Рассмотрим следующее определение класса, показывающее два конструктора:

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

Для определения этого класса, и когда IServiceProviderIsService присутствует, ActivatorUtilities.CreateInstance<A>(serviceProvider, new C()) создает экземпляр A, выбирая первый конструктор, который принимает B, C и string.

Представленная версия

.NET 8( предварительная версия 1)

Предыдущее поведение

ActivatorUtilities.CreateInstance в некоторых случаях вел себя неожиданно. Это гарантирует, что все необходимые экземпляры, переданные в него, существуют в рамках выбранного конструктора. Однако выбор конструктора был ошибкой и ненадежным.

Новое поведение

CreateInstance пытается найти самый длинный конструктор, соответствующий всем параметрам на основе поведения IServiceProviderIsService.

Замечание

Если IServiceProviderIsService настроен неправильно или не существует, CreateInstance может работать неправильно или неоднозначно.

Тип разрушающего изменения

Это изменение поведения.

Причина изменения

Это изменение было введено для исправления ошибки, в которой поведение изменилось в зависимости от порядка определений перегрузки конструктора.

Если приложение начинает вести себя по-разному или вызывает исключение после обновления до .NET 8, тщательно изучите определения конструктора для затронутого типа экземпляра. Ознакомьтесь с разделом "Новое поведение ".

Затронутые API

См. также