Injection de dépendance pour Azure Functions

azure functions logo

Dans cet article, nous ferons un retour sur la vidéo où nous avons vu comment mettre en place l’injection de dépendance pour s’en servir dans des Azure Functions. Bonne lecture!

Donc en rappel, la vidéo publiée récemment où on voit les étapes pour mettre en place l’injection de dépendance pour les Azure Functions:

Librairies nécessaires

Tout d’abord, certaines librairies sont nécessaires dans notre projet pour permettre l’injection de dépendance. La première est Microsoft.Azure.Functions.Extensions, qui nous permet de faire notre classe de startup pour y configurer l’injection. Cette librairie installe au même moment Microsoft.Extensions.DependencyInjection, qui est nécessaire pour ceci. Ensuite, il faut installer Microsoft.NET.Sdk.Functions, qui rend disponible le nécessaire pour créer des Azure Functions. Il est à noter que cette librairie est déjà installée si vous démarrez un projet de Azure Functions avec Visual Studio.

La classe de startup

Une fois les librairies installées, la prochaine étape est de créer notre classe pour se charger de l’injection. Cette classe doit hériter de FunctionsStartup pour que l’injection puisse se faire pour toutes les fonctions de notre projet. Il faut aussi ajouter un attribut au niveau de l’assembly pour indiquer que notre classe est celle du startup, comme ceci (à noter que j’ai nommé ma classe Startup):

[assembly: FunctionsStartup(typeof(BracketShow.Api.Startup))]

Par la suite, deux méthodes peuvent être surchargées pour répondre à nos besoins. La première est override void Configure(IFunctionsHostBuilder builder), qui nous permet d’y définir notre injection sur la propriété Services du builder. La deuxième est override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder), qui elle nous permet de jouer sur le ConfigurationBuilder, entre autre pour charger des fichiers de configuration additionnels. Prenons en exemple la classe utilisée dans la vidéo:

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder) =>
        builder.Services.AddLazyCache()
            .AddVideoServices(builder.GetContext().Configuration);

    public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
    {
        var context = builder.GetContext();

        builder.ConfigurationBuilder
            .AddJsonFile(Path.Combine(context.ApplicationRootPath,
                "appsettings.json"),
                optional: true, reloadOnChange: false)
            .AddJsonFile(Path.Combine(context.ApplicationRootPath,
                $"appsettings.{context.EnvironmentName}.json"),
                optional: true, reloadOnChange: false)
            .AddEnvironmentVariables();
    }
}

On voit donc l’utilisation de Configure pour injecter le nécessaire aux Azure Functions, dans ce cas-ci avec Lazy Cache et les services vidéos d’un autre projet. On peut aussi voir que builder.GetContext().Configuration nous permet d’envoyer la configuration provenant du fichier appsettings. Au niveau de ConfigureAppConfiguration, on peut y voir l’ajout de fichiers appsettings à la configuration, qui ne sont pas supportés par défaut dans le démarrage.

Conclusion

Comme vous avez pu constater, c’est très simple de mettre en place le nécessaire pour l’injection de dépendance pour les Azure Functions. Il suffit d’installer les librairies nécessaires et de créer une classe héritant de FunctionsStartup et y ajouter notre injection. Si vous avez des questions ou commentaires suite à cette lecture, n’hésitez pas à me laisser savoir!

Bruno

Auteur : Bruno

De jour, je suis développeur, chef d'équipe et le co-animateur du Bracket Show. De soir, je suis un mari et le père de deux magnifiques enfants. Le temps qu'il me reste après tout cela, je le passe à tenter de bouger, à jouer et écrire des critiques de jeux vidéos, ainsi qu'à préparer du matériel pour les enregistrements du Bracket Show et pour ce blog. Au travers tout cela, je suis aussi passionné de musique et de microbrasseries.