web-dev-qa-db-fra.com

DI dans les fonctions Azure

J'utilise certaines bibliothèques de classes que j'utilise dans mon application API Web ASP.NET, qui gèrent toutes mes tâches d'arrière-plan, par exemple. Opérations CRUD sur plusieurs bases de données, telles que la base de données Azure SQL, la base de données Cosmos, etc.

Je ne veux pas réinventer la roue et pouvoir les utiliser dans les nouvelles fonctions Azure que je crée dans Visual Studio 2017. Toutes mes méthodes de référentiel utilisent une interface. Alors, comment vais-je implémenter l'injection de dépendance dans ma nouvelle fonction Azure?

Je ne vois aucun soutien pour DI mais je suis un peu confus. Il semble que les fonctions Azure reposent sur le même SDK que WebJobs et je pense que Microsoft a commencé l'année dernière à prendre en charge DI dans WebJobs.

Existe-t-il un moyen de contourner ce problème afin de pouvoir utiliser mes bibliothèques existantes dans mon nouveau projet Azure Functions?

27
Sam

Je vois ces deux techniques en plus du modèle de recherche de service (anti). J'ai également sollicité les commentaires de l'équipe Fonctions Azure.

https://blog.wille-zone.de/post/Azure-functions-dependency-injection/

https://blog.wille-zone.de/post/Azure-functions-proper-dependency-injection/

22
Sam

Il existe une demande de fonctionnalité ouverte sur les pages GitHub pour Azure Functions concernant cette question.

Cependant, la façon dont je l'aborde utilise une sorte de point d'entrée 'wrapper', résout le problème à l'aide du localisateur de service et lance la fonction à partir de cet emplacement.

Cela ressemble un peu à ça (simplifié)

var builder = new ContainerBuilder();
//register my types

var container = builder.Build();

using(var scope = container.BeginLifetimeScope())
{
  var functionLogic = scope.Resolve<IMyFunctionLogic>();

  functionLogic.Execute();
}

C’est un peu hacky, bien sûr, mais c’est le meilleur jusqu’à présent (à ma connaissance).

8
Jan_V

J'aimerais y ajouter mes 2 centimes. J'ai utilisé la technique utilisée par Host pour l'injection d'ILogger. Si vous regardez le projet de démarrage, j'ai créé GenericBindingProvider qui implémente IBindingProvider. Puis, pour chaque type d'injection, je l'enregistre comme suit:

builder.Services.AddTransient<IWelcomeService, WelcomeService>();
builder.Services.AddSingleton<IBindingProvider, GenericBindingProvider<IWelcomeService>>();

L'inconvénient est que vous devez enregistrer le type que vous souhaitez injecter deux fois dans la fonction.

Exemple de code:

Exemple d'injection de dépendance Azure Functions V2

0
aczarkowski

Le blog willie-zone a beaucoup parlé de ce sujet, mais vous n'avez pas besoin de suivre cette voie pour utiliser DI avec les fonctions Azure.

Si vous utilisez la version 2, vous pouvez rendre vos fonctions Azure non statiques. Ensuite, vous pouvez ajouter un constructeur public pour injecter vos dépendances. L'étape suivante consiste à ajouter une classe IWebJobsStartup. Dans votre classe de démarrage, vous pourrez enregistrer vos services comme vous le feriez pour tout autre projet .Net Core. 

J'ai un dépôt public qui utilise cette approche ici: https://github.com/jedi91/MovieSearch/tree/master/MovieSearch

Voici un lien direct vers la classe de démarrage: https://github.com/jedi91/MovieSearch/blob/master/MovieSearch/Startup.cs

Et voici la fonction: https://github.com/jedi91/MovieSearch/blob/master/MovieSearch/Functions/Search.cs

J'espère que cette approche aide. Si vous souhaitez conserver votre fonction Azure Functions statique, l'approche willie-zone devrait fonctionner, mais j'aime beaucoup cette approche et elle ne nécessite aucune bibliothèque tierce. 

Une chose à noter est le fichier Directory.Build.target. Ce fichier copiera vos extensions dans le fichier hôte afin que DI puisse fonctionner une fois la fonction déployée sur Azure. L'exécution de la fonction localement ne nécessite pas ce fichier. 

0