Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le comportement de ActivatorUtilities.CreateInstance est maintenant plus cohérent avec CreateFactory(Type, Type[]). Quand IServiceProviderIsService n’est pas présent dans le conteneur d’injection de dépendances (DI), CreateInstance revient à la logique de CreateFactory(Type, Type[]). Dans cette logique, un seul constructeur est autorisé à correspondre à tous les paramètres d’entrée fournis.
Dans le cas le plus général, lorsque IServiceProviderIsService est présent, l’API CreateInstance préfère la plus longue surcharge de constructeur qui a tous ses arguments disponibles. Les arguments peuvent être entrés dans l’API, inscrits dans le conteneur ou disponibles à partir de valeurs par défaut dans le constructeur lui-même.
Considérez la définition de classe suivante montrant deux constructeurs :
public class A
{
A(B b, C c, string st = "default string") { }
A() { }
}
Pour cette définition de classe, et quand IServiceProviderIsService elle est présente, ActivatorUtilities.CreateInstance<A>(serviceProvider, new C()) instancie A en sélectionnant le premier constructeur qui prend B, Cet string.
Version introduite
.NET 8 Préversion 1
Comportement précédent
ActivatorUtilities.CreateInstance se comporte de façon inattendue dans certains cas. Il s’est assuré que toutes les instances requises qui lui ont été transmises existaient dans le constructeur choisi. Toutefois, la sélection du constructeur comportait des bogues et était peu fiable.
Nouveau comportement
CreateInstance tente de trouver le constructeur le plus long qui correspond à tous les paramètres en fonction du comportement de IServiceProviderIsService.
- Si aucun constructeur n’est trouvé ou s’il IServiceProviderIsService n’est pas présent, il revient à la logique CreateFactory(Type, Type[]).
- S’il trouve plusieurs constructeurs, il lève une InvalidOperationException.
Remarque
S’il IServiceProviderIsService est mal configuré ou n’existe pas, CreateInstance peut fonctionner incorrectement ou ambiguëment.
Type de changement cassant
Ce changement est un changement de comportement.
Raison de la modification
Cette modification a été introduite pour corriger un bogue dans lequel le comportement a changé en fonction de l’ordre des définitions de surcharge du constructeur.
Action recommandée
Si votre application commence à se comporter différemment ou à lever une exception après la mise à niveau vers .NET 8, examinez attentivement les définitions du constructeur pour le type d’instance concerné. Reportez-vous à la section Nouveau comportement .
API affectées
- Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance<T>(IServiceProvider, Object[])
- Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider, Type, Object[])