Condividi tramite


ActivatorUtilities.CreateInstance si comporta in modo coerente

Il comportamento di ActivatorUtilities.CreateInstance è ora più coerente con CreateFactory(Type, Type[]). Quando IServiceProviderIsService non è presente nel contenitore di inserimento delle dipendenze( DI), CreateInstance esegue il fallback alla logica di CreateFactory(Type, Type[]). In tale logica, è consentito che solo un costruttore corrisponda a tutti i parametri di input forniti.

Nel caso più generale, quando IServiceProviderIsService è presente, l'API CreateInstance preferisce l'overload del costruttore più lungo con tutti gli argomenti disponibili. Gli argomenti possono essere input per l'API, registrati nel contenitore o disponibili dai valori predefiniti nel costruttore stesso.

Si consideri la definizione di classe seguente che mostra due costruttori:

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

Per questa definizione di classe e, quando IServiceProviderIsService è presente, ActivatorUtilities.CreateInstance<A>(serviceProvider, new C()) crea un'istanza A selezionando il primo costruttore che accetta B, C e string.

Versione introdotta

.NET 8 Anteprima 1

Comportamento precedente

ActivatorUtilities.CreateInstance si è comportato in modo imprevisto in alcuni casi. Ha verificato che nel costruttore scelto siano presenti tutte le istanze necessarie passate. Tuttavia, la selezione del costruttore era buggy e inaffidabile.

Nuovo comportamento

CreateInstance tenta di trovare il costruttore più lungo che corrisponde a tutti i parametri in base al comportamento di IServiceProviderIsService.

Nota

Se IServiceProviderIsService è configurato in modo non corretto o non esiste, CreateInstance può funzionare in modo non corretto o ambiguo.

Tipo di modifica che causa un'interruzione

Questa è una modifica funzionale.

Motivo della modifica

Questa modifica è stata introdotta per correggere un bug in cui il comportamento è cambiato a seconda dell'ordine delle definizioni di overload del costruttore.

Se l'app inizia a comportarsi in modo diverso o genera un'eccezione dopo l'aggiornamento a .NET 8, esaminare attentamente le definizioni del costruttore per il tipo di istanza interessato. Fare riferimento alla sezione Nuovo comportamento.

API interessate

Vedi anche