39 votes

DI dans les fonctions Azure

J'ai quelques bibliothèques de classe que j'utilise dans mon ASP.NET l'API Web app qui traitent tous mes backend trucs par exemple, les opérations CRUD à plusieurs bases de données comme Azure SQL Base de données, Cosmos DB, etc.

Je ne veux pas ré-inventer la roue, et de pouvoir les utiliser dans une nouvelle Azure Fonctions que je crée dans Visual Studio 2017. Tous mes référentiel des méthodes d'utilisation d'une interface. Alors, comment vais-je mettre en œuvre l'injection de dépendance dans ma nouvelle Azure fonction?

Je ne vois pas de n'importe quel support pour DI mais je suis un peu confus. Il semble Azure Fonctions sont basées sur le même SDK comme WebJobs et je pense que l'année dernière, Microsoft avait commencé à soutenir DI dans WebJobs - je sais pour sûr, parce que j'ai mis en place à l'aide de Ninject.

Est-il moyen de contourner ce problème afin que je puisse utiliser mon bibliothèques existantes dans ma nouvelle Azure Fonctions de projet?

29voto

Sam Points 5642

Je vois ces deux techniques en plus du service locator (anti)modèle. J'ai demandé à l'Azur de l'équipe pour leurs commentaires ainsi.

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

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

8voto

Jan_V Points 1285

Il est ouvert demande de fonctionnalité sur le GitHub pages pour Azure Fonctions relatives à cette affaire.

Toutefois, la façon dont j'aborde c'est à l'aide d'une sorte de "wrapper' point d'entrée, de résoudre cela en utilisant le localisateur de service et et lancement de la fonction à partir de là.

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 qui existe jusqu'à ce qu'il y a à l'instant (à ma connaissance).

5voto

J'ai vu le willie-zone blog mentionné beaucoup quand il s'agit de ce sujet, mais vous n'avez pas besoin d'aller dans cette voie à l'utilisation DI avec Azure fonctions.

Si vous utilisez Version2 vous pouvez faire votre Azure fonctions non-statique. Vous pouvez ensuite ajouter un constructeur public pour l'injection de vos dépendances. La prochaine étape consiste à ajouter un IWebJobsStartup classe. Dans de démarrage de votre classe, vous allez pouvoir enregistrer vos services comme vous le feriez pour tout autre .Net de Base du projet.

J'ai un public de pensions qui est de l'utilisation de cette approche ici: https://github.com/jedi91/MovieSearch/tree/master/MovieSearch

Voici un lien direct pour le démarrage de la classe: 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

Espérons que cette approche aide. Si vous êtes désireux de garder votre Azure Fonctions statiques puis willie-zone d'approche devrait fonctionner, mais j'aime vraiment cette approche et il ne nécessite pas de bibliothèques tierces.

Une chose à noter est le Répertoire.Construire.fichier cible. Ce fichier permettra de copier vos extensions dans le fichier host de sorte que DI de travail une fois que la fonction est déployé sur Azure. L'exécution de la fonction au niveau local, ne nécessitent pas de ce fichier.

5voto

mwilson Points 2567

Azure Functions Depdendency Injection a été annoncé lors de MSBuild 2019. Voici un exemple de procédure à suivre:

 [assembly: FunctionsStartup(typeof(MyNamespace.Startup))]

namespace MyNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddHttpClient();
            builder.Services.AddSingleton((s) => {
                return new CosmosClient(Environment.GetEnvironmentVariable("COSMOSDB_CONNECTIONSTRING"));
            });
            builder.Services.AddSingleton<ILoggerProvider, MyLoggerProvider>();
        }
    }
}
 

2voto

aczarkowski Points 11

Je voudrais ajouter mes 2 cents pour elle. J'ai utilisé la technique qu'il est utilisé par l'Hôte de l'injection de ILogger. Si vous regardez le Démarrage du projet, j'ai créé GenericBindingProvider qui implémente IBindingProvider. Ensuite, pour chaque type, je veux être injecté-je m'inscrire comme suit:

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

L'inconvénient est que vous devez vous inscrire le type que vous souhaitez être injecté dans la fonction deux fois.

Exemple de code:

Azure Fonctions V2 Injection de Dépendance de l'échantillon

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