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.
- Se non viene trovato alcun costruttore o se IServiceProviderIsService non è presente, viene eseguito il fallback alla logica CreateFactory(Type, Type[]).
- Se trova più costruttori, genera un'eccezione InvalidOperationException.
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.
Azione consigliata
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
- Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance<T>(IServiceProvider, Object[])
- Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider, Type, Object[])