Dela via


ActivatorUtilities.CreateInstance fungerar konsekvent

Beteendet ActivatorUtilities.CreateInstance för är nu mer konsekvent med CreateFactory(Type, Type[]). När IServiceProviderIsService finns inte i beroendeinmatningscontainern CreateInstance (DI) återgår du till logiken CreateFactory(Type, Type[]) . I den logiken tillåts endast en konstruktor matcha med alla angivna indataparametrar.

I det mer allmänna fallet när IServiceProviderIsService är närvarande föredrar API:et CreateInstance den längsta konstruktoröverlagringen som har alla dess argument tillgängliga. Argumenten kan vara indata till API:et, registrerade i containern eller tillgängliga från standardvärdena i själva konstruktorn.

Överväg följande klassdefinition som visar två konstruktorer:

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

För den här klassdefinitionen, och när IServiceProviderIsService är närvarande, ActivatorUtilities.CreateInstance<A>(serviceProvider, new C()) instansierar A genom att välja den första konstruktorn som tar B, Coch string.

Version introducerad

Förhandsversion 1 av .NET 8

Tidigare beteende

ActivatorUtilities.CreateInstance betedde sig oväntat i vissa fall. Den såg till att alla nödvändiga instanser som skickades till den fanns i den valda konstruktorn. Konstruktorns val var dock buggigt och opålitligt.

Nytt beteende

CreateInstance försöker hitta den längsta konstruktorn som matchar alla parametrar baserat på beteendet för IServiceProviderIsService.

Kommentar

Om IServiceProviderIsService har konfigurerats felaktigt eller inte finns kan CreateInstance det fungera felaktigt eller tvetydigt.

Typ av icke-bakåtkompatibel ändring

Den här ändringen är en beteendeförändring.

Orsak till ändringen

Den här ändringen introducerades för att åtgärda en bugg där beteendet ändrades beroende på ordningen på konstruktoröverlagringsdefinitioner.

Om appen börjar bete sig annorlunda eller utlöser ett undantag efter uppgraderingen till .NET 8 bör du noggrant undersöka konstruktordefinitionerna för den berörda instanstypen. Se avsnittet Nytt beteende .

Berörda API:er

Se även