3 votes

Pourquoi les génériques partiellement fermés fonctionnent-ils lorsqu'ils sont exécutés dans une fonction, mais pas lorsqu'ils appellent directement ServiceCollection ?

Je viens d'essayer d'utiliser pour la première fois un enregistrement DI générique partiellement fermé en utilisant dotnet 3.1, v3 Azure functions et 3.1.8 du paquet MS DependencyInjection - tous les plus récents au moment de la rédaction.

Les types sont résolus comme espérés lorsqu'ils sont définis comme dépendances de constructeur. Cependant, lorsque j'appelle GetService<> directement sur le conteneur, j'obtiens un message d'erreur de type ArgumentException :

Le nombre d'arguments génériques fournis n'est pas égal à l'arité de la définition du type générique.

Si je voyais cette erreur pendant l'exécution, j'en conclurais que les génériques partiellement fermés ne sont pas pris en charge, mais ce n'est pas le cas et je n'arrive pas à comprendre pourquoi.

public interface IMyInterface<TypeA, TypeB>
{

}

public class MyClass<TypeA> : IMyInterface<TypeA, MyConcreteTypeB>
{
}

services.AddSingleton(typeof(IMyInterface<,>), typeof(MyClass<>));

var myObject = services
   .BuildServiceProvider()
   .GetService<IMyInterface<MyConcreteTypeA, MyConcreteTypeB>>();

myObject.Should().Be().OfType<MyClass<MyConcreteTypeA>>();

Je ne peux pas exécuter le code (approximatif) ci-dessus en tant que test unitaire, mais je peux résoudre les problèmes suivants IMyInterface<MyConcreteTypeA, MyConcreteTypeB> comme paramètre de construction dans une fonction Azure.

Mise à jour :

Exemple de travail : https://github.com/mr-panucci/sandbox

3voto

krishg Points 4240

C'est une question intéressante. La raison pour laquelle cela fonctionne dans le constructeur de la fonction est qu'en interne, l'hôte de la fonction utilise la fonction DryIoc en tant que conteneur DI mettant en œuvre un fournisseur de services personnalisé de Microsoft.DependencyInjection . Le conteneur DryIoc prend à son tour en charge la résolution des types génériques partiellement fermés. Vous pouvez explorer le câblage de Function Host DI ici .

Maintenant pour résoudre votre problème de test unitaire pour simuler le même comportement de Function host ici :

  1. Ajouter nuget DryIoc.Microsoft.DependencyInjection à votre projet de test.
  2. Mettez à jour le code de test comme ci-dessous :

    services.AddSingleton(typeof(IMyInterface<,>), typeof(MyClass<>));

    var myObject = DryIocAdapter.Create(services).BuildServiceProvider() // using DryIoc.Microsoft.DependencyInjection; .GetService<IMyInterface<MyConcreteTypeA, MyConcreteTypeB>>();

    myObject.Should().Be().OfType<MyClass<MyConcreteTypeA>>();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X