Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.
- Om inga konstruktorer hittas eller om IServiceProviderIsService inte är närvarande, återgår logiken till CreateFactory(Type, Type[]).
- Om den hittar mer än en konstruktor genererar den en InvalidOperationException.
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.
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[])