Dela via


ActivatorUtilities.CreateInstance fungerar konsekvent

Beteendet hos ActivatorUtilities.CreateInstance är nu mer konsekvent med CreateFactory(Type, Type[]). När IServiceProviderIsService inte finns i beroendeinmatningscontainern (DI), återgår CreateInstance 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 lanserad

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 överlämnades till den existerade 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.

Anmärkning

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

Typ av brytande ändring

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

Orsak till ändring

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