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
, C
och 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.
- Om inga konstruktorer hittas eller om IServiceProviderIsService de inte finns, återgår det till CreateFactory(Type, Type[]) logiken.
- Om den hittar mer än en konstruktor genererar den en InvalidOperationException.
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.
Rekommenderad åtgärd
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
- Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance<T>(IServiceProvider, Object[])
- Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider, Type, Object[])