Compartir a través de


ActivatorUtilities.CreateInstance se comporta de forma coherente

El comportamiento de ActivatorUtilities.CreateInstance ahora es más coherente con CreateFactory(Type, Type[]). Cuando IServiceProviderIsService no está presente en el contenedor de inyección de dependencias (DI), CreateInstance vuelve a la lógica de CreateFactory(Type, Type[]). En esa lógica, solo se permite que un constructor coincida con todos los parámetros de entrada proporcionados.

En el caso más general cuando IServiceProviderIsService está presente, la CreateInstance API prefiere la sobrecarga de constructor más larga que tiene todos sus argumentos disponibles. Los argumentos pueden ser de entrada para la API, registrados en el contenedor o disponibles a partir de valores predeterminados en el propio constructor.

Tenga en cuenta la siguiente definición de clase que muestra dos constructores:

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

Para esta definición de clase y, cuando IServiceProviderIsService está presente, ActivatorUtilities.CreateInstance<A>(serviceProvider, new C()) crea instancias A seleccionando el primer constructor que toma B, Cy string.

Versión introducida

.NET 8 Preview 1

Comportamiento anterior

ActivatorUtilities.CreateInstance se comportaba inesperadamente en algunos casos. Se ha asegurado de que todas las instancias necesarias que se le han pasado existían en el constructor elegido. Sin embargo, la selección del constructor daba errores y era poco fiable.

Nuevo comportamiento

CreateInstance intenta encontrar el constructor más largo que coincida con todos los parámetros en función del comportamiento de IServiceProviderIsService.

Nota:

Si IServiceProviderIsService está configurado incorrectamente o no existe, CreateInstance puede funcionar incorrectamente o ambiguamente.

Tipo de cambio disruptivo

Este es un cambio de comportamiento.

Motivo del cambio

Este cambio se introdujo para corregir un error en el que el comportamiento cambió en función del orden de las definiciones de sobrecarga del constructor.

Si la aplicación comienza a comportarse de forma diferente o inicia una excepción después de actualizar a .NET 8, examine detenidamente las definiciones de constructor para el tipo de instancia afectado. Consulte la sección Nuevo comportamiento .

Las APIs afectadas

Consulte también