Delen via


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, Cen 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.

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.

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

Zie ook