Comment utiliser l'injection de dépendances dans ASP.Net Core

La prise en charge de l'injection de dépendances est intégrée à ASP.Net Core, le framework open source, multiplateforme, allégé et modulaire de Microsoft pour la création d'applications Web évolutives hautes performances. Dans ASP.Net Core, les services de structure et les services d'application peuvent être injectés dans vos classes, plutôt que d'être étroitement couplés. Dans cet article, nous verrons comment nous pouvons travailler avec l'injection de dépendances dans ASP.Net Core.

L'injection de dépendances (également appelée DI) est un modèle de conception dans lequel une classe ou un objet a ses classes dépendantes injectées (qui lui sont transmises par une autre classe ou un autre objet) plutôt que de les créer directement. L'injection de dépendance facilite le couplage lâche et favorise la testabilité et la maintenance. De plus, l'injection de dépendances vous permet de modifier vos implémentations sans avoir à changer les classes ou les interfaces qui exploitent ces implémentations.

Rendre un service disponible via l'injection de dépendances dans ASP.Net

Nous allons maintenant créer un service simple dans Visual Studio à l'aide d'ASP.Net Core et illustrer comment nous pouvons l'ajouter au conteneur d'injection de dépendances, l'enregistrer avec le pipeline, puis le consommer dans notre application. Suivez ces étapes pour créer un nouveau projet ASP.Net Core dans Visual Studio 2017 ou Visual Studio 2015. Si vous utilisez Visual Studio 2015, assurez-vous que .Net Core est installé.

  1. Ouvrez Visual Studio
  2. Cliquez sur Fichier -> Nouveau -> Projet
  3. Dans la fenêtre de dialogue Nouveau projet, sélectionnez le modèle de projet «Application Web ASP.NET Core»
  4. Spécifiez le nom et l'emplacement de votre projet et cliquez sur OK pour enregistrer

Maintenant, créez la classe POCO (ancien objet CLI) suivante. Cette classe ne contient qu'une seule propriété - elle représente tous les domaines abordés par les auteurs d'une société d'édition particulière.

classe publique TopicArea

    {

        chaîne publique Name {get; ensemble; }

    }

Considérez l'interface suivante nommée ITopicAreaServicequi représente le contrat pour le TopicAreaService.

interface publique ITopicAreaService

    {

        IEnumerable GetAllTopicAreas ();

    }

L' ITopicAreaServiceinterface contient la déclaration d'une méthode appelée GetAllTopicAreas(). La TopicAreaServiceclasse implémente le ITopicAreaServicecomme indiqué ci-dessous.

classe publique TopicAreaService: ITopicAreaService

    {

        public IEnumerable GetAllTopicAreas ()

        {

            retourner une nouvelle liste

        {

            nouveau TopicArea {Name},

            nouveau TopicArea {Name},

            nouveau TopicArea {Name}

        };

        }

    }

Inscription des services pour l'injection de dépendances dans ASP.Net

L'étape suivante consiste à enregistrer le TopicAreaServiceavec le conteneur d'injection de dépendances disponible dans le cadre du code ASP.Net. Pour ce faire, écrivez le morceau de code suivant dans la ConfigureServicesméthode dans le fichier Startup.cs. La ConfigureServicesméthode ajoute des services au conteneur de services, ce qui les rend disponibles dans votre application via l'injection de dépendances. Il est appelé automatiquement par le runtime.

public void ConfigureServices (services IServiceCollection)

        {

            services.AddTransient ();

            // Ajouter des services de structure.

            services.AddMvc ();

        }

Si vous avez plusieurs services qui doivent être enregistrés, vous pouvez utiliser une méthode d'extension comme indiqué ci-dessous.

public static class ServiceExtensions

    {

        public static IServiceCollection RegisterServices (

            ces services IServiceCollection)

        {

            services.AddTransient ();

            // Ajoutez tous les autres services ici.

            services de retour;

        }

    }

L'utilisation de la RegisterServicesméthode vous permet de garder votre ConfigureServicesméthode légère et maintenable. Au lieu de spécifier chaque service dans ConfigureServices, tout ce que vous avez à faire est d'appeler la RegisterServicesméthode d'extension une fois dans votre ConfigureServicesméthode, comme indiqué dans l'extrait de code ci-dessous.

public void ConfigureServices (services IServiceCollection)

        {

            services.RegisterServices ();

            // Ajouter des services de structure.

            services.AddMvc ();

        }

Durée de vie des injections de dépendances dans ASP.Net

La durée de vie de l'injection de dépendances est utilisée pour spécifier le moment où les objets dépendants sont créés et recréés. En ce qui concerne la durée de vie des instances d'injection de dépendances dans les applications ASP.Net Core, il existe trois possibilités:

  1. Singleton: cela implique qu'une seule instance sera créée et partagée par tous les consommateurs.
  2. Scoped: Cela implique qu'une instance par étendue (c'est-à-dire une instance par requête à l'application) sera créée.
  3. Transitoire: cela implique que les composants ne seront pas partagés mais seront créés à chaque fois qu'ils seront demandés.

Notez que dans cet exemple, nous avons utilisé le Transienttype. L'extrait de code suivant illustre comment vous pouvez utiliser les autres types de durée de vie lors de l'inscription de votre service.

services.AddScoped ();

services.AddSingleton ();

Utilisation d'un service via l'injection de dépendances dans ASP.Net

Maintenant que le service que nous avons implémenté a été ajouté au pipeline, vous pouvez l'utiliser dans n'importe quel contrôleur de votre projet ASP.Net Core. L'extrait de code suivant illustre comment vous pouvez demander une instance de TopicAreaServicedans votre contrôleur.

private en lecture seule ITopicAreaService _topicAreaService;

    public DefaultController (ITopicAreaService topicAreaService)

    {

        _topicAreaService = topicAreaService;

    }

Voici comment la GetAllTopicAreasméthode de TopicAreaServiceest appelée à partir de la méthode d'action de votre contrôleur.

[HttpGet]

        public IEnumerable GetAllTopicAreas ()

        {

            return _topicAreaService.GetAllTopicAreas ();

        }

Vous trouverez ci-dessous la liste complète des codes de la classe de contrôleur pour votre référence.
en utilisant Microsoft.AspNetCore.Mvc;

using System.Collections.Generic;

espace de noms ASPNETCoreDI.Controllers

{

    [Produit ("application / json")]

    [Route ("api / Default")]

    public class DefaultController: Controller

    {

        private en lecture seule ITopicAreaService _topicAreaService;

        public DefaultController (ITopicAreaService topicAreaService)

        {

            _topicAreaService = topicAreaService;

        }

        [HttpGet]

        public IEnumerable GetAllTopicAreas ()

        {

            return _topicAreaService.GetAllTopicAreas ();

        }

    }

}

Vous pouvez tirer parti de la prise en charge intégrée de l'injection de dépendances dans ASP.Net Core pour créer des applications modulaires, simples et propres, faciles à gérer et à tester. Le fournisseur d'injection de dépendances intégré dans ASP.Net Core n'est pas aussi riche en fonctionnalités que des conteneurs tels que StructureMap et Ninject, mais il est assez rapide et, comme nous l'avons vu, facile à configurer et à utiliser.