ActivatorUtilities.CreateInstance gedraagt zich consistent
Het gedrag is ActivatorUtilities.CreateInstance nu consistenter met CreateFactory(Type, Type[]). Wanneer IServiceProviderIsService deze niet aanwezig is in de container voor afhankelijkheidsinjectie (DI), CreateInstance valt u terug op de CreateFactory(Type, Type[]) logica. In die logica mag slechts één constructor overeenkomen met alle opgegeven invoerparameters.
In het meest algemene geval wanneer IServiceProviderIsService deze aanwezig is, geeft de CreateInstance
API de voorkeur aan de langste constructor-overbelasting met alle beschikbare argumenten. De argumenten kunnen worden ingevoerd voor de API, geregistreerd in de container of beschikbaar zijn op basis van standaardwaarden in de constructor zelf.
Houd rekening met de volgende klassedefinitie met twee constructors:
public class A
{
A(B b, C c, string st = "default string") { }
A() { }
}
Voor deze klassedefinitie en wanneer IServiceProviderIsService
deze aanwezig is, ActivatorUtilities.CreateInstance<A>(serviceProvider, new C())
wordt geïnstitueerd A
door de eerste constructor te kiezen die gebruikt B
, C
en string
.
Versie geïntroduceerd
.NET 8 Preview 1
Vorig gedrag
ActivatorUtilities.CreateInstance gedraagt zich onverwacht in sommige gevallen. Het zorgde ervoor dat alle vereiste exemplaren die eraan werden doorgegeven, bestonden in de gekozen constructor. De constructorselectie was echter buggy en onbetrouwbaar.
Nieuw gedrag
CreateInstance probeert de langste constructor te vinden die overeenkomt met alle parameters op basis van het gedrag van IServiceProviderIsService.
- Als er geen constructors worden gevonden of IServiceProviderIsService niet aanwezig zijn, valt deze terug op CreateFactory(Type, Type[]) logica.
- Als er meer dan één constructor wordt gevonden, wordt er een InvalidOperationException.
Notitie
Als IServiceProviderIsService deze onjuist is geconfigureerd of niet bestaat, CreateInstance
werkt dit mogelijk onjuist of dubbelzinnig.
Type wijziging die fouten veroorzaken
Deze wijziging is een gedragswijziging.
Reden voor wijziging
Deze wijziging is geïntroduceerd om een fout op te lossen waarbij het gedrag is gewijzigd, afhankelijk van de volgorde van overbelastingsdefinities van constructors.
Aanbevolen actie
Als uw app zich anders gedraagt of een uitzondering genereert na de upgrade naar .NET 8, moet u de constructordefinities voor het betrokken exemplaartype zorgvuldig onderzoeken. Raadpleeg de sectie Nieuw gedrag .
Betrokken API's
- Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance<T>(IServiceProvider, Object[])
- Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider, Type, Object[])