Injection de dépendances d’ASP.NET MVC 4

Par l’équipe Web Camps

Télécharger le kit de formation Web Camps

Ce laboratoire pratique suppose que vous avez des connaissances de base sur ASP.NET filtres MVC et ASP.NET MVC 4. Si vous n’avez pas utilisé ASP.NET filtres MVC 4 auparavant, nous vous recommandons de parcourir ASP.NET laboratoire pratique des filtres d’action personnalisés MVC .

Notes

Tous les exemples de code et extraits de code sont inclus dans le Kit de formation Web Camps, disponible à partir de Microsoft-Web/WebCampTrainingKit Releases. Le projet spécifique à ce labo est disponible sur ASP.NET injection de dépendances MVC 4.

Dans le paradigme de programmation orientée objet , les objets fonctionnent ensemble dans un modèle de collaboration où il existe des contributeurs et des consommateurs. Naturellement, ce modèle de communication génère des dépendances entre les objets et les composants, ce qui devient difficile à gérer lorsque la complexité augmente.

Dépendances de classe et complexité du modèle

Dépendances de classe et complexité du modèle

Vous avez probablement entendu parler du modèle d’usine et de la séparation entre l’interface et l’implémentation à l’aide de services, où les objets clients sont souvent responsables de l’emplacement du service.

Le modèle d’injection de dépendances est une implémentation particulière de l’inversion de contrôle. L’inversion de contrôle (IoC) signifie que les objets ne créent pas d’autres objets sur lesquels ils s’appuient pour effectuer leur travail. Au lieu de cela, ils obtiennent les objets dont ils ont besoin à partir d’une source externe (par exemple, un fichier de configuration xml).

L’injection de dépendances (DI) signifie que cette opération est effectuée sans intervention d’objet, généralement par un composant d’infrastructure qui transmet les paramètres du constructeur et définit les propriétés.

Modèle de conception d’injection de dépendances (DI)

À un niveau élevé, l’objectif de l’injection de dépendances est qu’une classe cliente (par exemple , le golfeur) a besoin de quelque chose qui satisfait une interface (par exemple , IClub). Il ne se soucie pas du type de béton (par exemple , WoodClub, IronClub, WedgeClub ou PutterClub), il veut que quelqu’un d’autre gère cela (par exemple, un bon caddy). Le résolveur de dépendances dans ASP.NET MVC peut vous permettre d’inscrire votre logique de dépendance ailleurs (par exemple, un conteneur ou un sac de clubs).

Diagramme d’injection de

Injection de dépendances - Analogie golf

Les avantages de l’utilisation du modèle d’injection de dépendances et de l’inversion de contrôle sont les suivants :

  • Réduit le couplage de classes
  • Augmente la réutilisation du code
  • Améliore la facilité de maintenance du code
  • Améliore les tests d’application

Notes

L’injection de dépendances est parfois comparée au modèle de conception d’usine abstraite, mais il existe une légère différence entre les deux approches. Di dispose d’un framework qui travaille derrière pour résoudre les dépendances en appelant les usines et les services inscrits.

Maintenant que vous comprenez le modèle d’injection de dépendances, vous allez apprendre tout au long de ce labo à l’appliquer dans ASP.NET MVC 4. Vous allez commencer à utiliser l’injection de dépendances dans les contrôleurs pour inclure un service d’accès à la base de données. Ensuite, vous allez appliquer l’injection de dépendances aux vues pour consommer un service et afficher des informations. Enfin, vous allez étendre la DI à ASP.NET filtres MVC 4, en injectant un filtre d’action personnalisé dans la solution.

Dans ce labo pratique, vous allez apprendre à :

  • Intégrer ASP.NET MVC 4 à Unity pour l’injection de dépendances à l’aide de packages NuGet
  • Utiliser l’injection de dépendances à l’intérieur d’un contrôleur MVC ASP.NET
  • Utiliser l’injection de dépendances dans une vue MVC ASP.NET
  • Utiliser l’injection de dépendances à l’intérieur d’un filtre d’action MVC ASP.NET

Notes

Ce labo utilise le package NuGet Unity.Mvc3 pour la résolution des dépendances, mais il est possible d’adapter n’importe quel framework d’injection de dépendances pour qu’il fonctionne avec ASP.NET MVC 4.

Prérequis

Vous devez disposer des éléments suivants pour effectuer ce labo :

Programme d’installation

Installation d’extraits de code

Pour des raisons pratiques, une grande partie du code que vous allez gérer tout au long de ce labo est disponible sous forme d’extraits de code Visual Studio. Pour installer les extraits de code, exécutez le fichier .\Source\Setup\CodeSnippets.vsi .

Si vous n’êtes pas familiarisé avec les extraits de code Visual Studio et que vous souhaitez apprendre à les utiliser, vous pouvez vous référer à l’annexe de ce document « Annexe B : Utilisation des extraits de code ».


Exercices

Cet Hands-On Lab est composé des exercices suivants :

  1. Exercice 1 : Injection d’un contrôleur
  2. Exercice 2 : Injection d’une vue
  3. Exercice 3 : Injection de filtres

Notes

Chaque exercice est accompagné d’un dossier End contenant la solution obtenue que vous devez obtenir une fois les exercices terminés. Vous pouvez utiliser cette solution comme guide si vous avez besoin d’aide supplémentaire pour effectuer les exercices.

Durée estimée de ce labo : 30 minutes.

Exercice 1 : Injection d’un contrôleur

Dans cet exercice, vous allez apprendre à utiliser l’injection de dépendances dans ASP.NET contrôleurs MVC en intégrant Unity à l’aide d’un package NuGet. Pour cette raison, vous allez inclure des services dans vos contrôleurs MvcMusicStore pour séparer la logique de l’accès aux données. Les services créent une nouvelle dépendance dans le constructeur du contrôleur, qui sera résolue à l’aide de l’injection de dépendances à l’aide d’Unity.

Cette approche vous montre comment générer des applications moins couplées, plus flexibles et plus faciles à gérer et à tester. Vous apprendrez également à intégrer ASP.NET MVC à Unity.

À propos du service StoreManager

Le Magasin de musique MVC fourni dans la solution de début inclut désormais un service qui gère les données du contrôleur de magasin nommé StoreService. Vous trouverez ci-dessous l’implémentation du service Store. Notez que toutes les méthodes retournent des entités Model.

namespace MvcMusicStore.Controllers
{    
    using System.Web.Mvc;
    using MvcMusicStore.Filters;
    using MvcMusicStore.Services;

    [MyNewCustomActionFilter(Order = 1)]
    [CustomActionFilter(Order = 2)]
    public class StoreController : Controller
    {
        private IStoreService service;

        public StoreController(IStoreService service)
        {
            this.service = service;
        }

        // GET: /Store/
        public ActionResult Details(int id)
        {
            var album = this.service.GetAlbum(id);
            if (album == null)
            {
                return this.HttpNotFound();
            }

            return this.View(album);
        }

        public ActionResult Browse(string genre)
        {
            // Retrieve Genre and its Associated Albums from database
            var genreModel = this.service.GetGenreByName(genre);

            return this.View(genreModel);
        }

        public ActionResult Index()
        {
            var genres = this.service.GetGenres();

            return this.View(genres);
        }

        // GET: /Store/GenreMenu
        public ActionResult GenreMenu()
        {
            var genres = this.service.GetGenres();

            return this.PartialView(genres);
        }
    }
}

StoreController de la solution de début consomme désormais StoreService. Toutes les références de données ont été supprimées de StoreController et il est désormais possible de modifier le fournisseur d’accès aux données actuel sans modifier aucune méthode qui consomme StoreService.

Vous trouverez ci-dessous que l’implémentation de StoreController a une dépendance avec StoreService à l’intérieur du constructeur de classe.

Notes

La dépendance introduite dans cet exercice est liée à l’inversion de contrôle (IoC).

Le constructeur de classe StoreController reçoit un paramètre de type IStoreService , qui est essentiel pour effectuer des appels de service à partir de l’intérieur de la classe. Toutefois, StoreController n’implémente pas le constructeur par défaut (sans paramètres) que tout contrôleur doit avoir pour travailler avec ASP.NET MVC.

Pour résoudre la dépendance, le contrôleur doit être créé par une fabrique abstraite (classe qui retourne tout objet du type spécifié).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcMusicStore.ViewModels;
using MvcMusicStore.Models;
using MvcMusicStore.Services;

namespace MvcMusicStore.Controllers
{
    public class StoreController : Controller
    {
        private IStoreService service;

        public StoreController(IStoreService service)
        {
            this.service = service;
        }

        //
        // GET: /Store/
        public ActionResult Index()
        {
            // Create list of genres
            var genres = this.service.GetGenreNames();

            // Create your view model
            var viewModel = new StoreIndexViewModel
            {
                Genres = genres.ToList(),
                NumberOfGenres = genres.Count()
            };

            return View(viewModel);
        }

        //
        // GET: /Store/Browse?genre=Disco
        public ActionResult Browse(string genre)
        {
            var genreModel = this.service.GetGenreByName(genre);

            var viewModel = new StoreBrowseViewModel()
            {
                Genre = genreModel,
                Albums = genreModel.Albums.ToList()
            };

            return View(viewModel);
        }

        //
        // GET: /Store/Details/5
        public ActionResult Details(int id)
        {
            var album = this.service.GetAlbum(id);

            return View(album);
        }
    }
}

Notes

Vous obtiendrez une erreur lorsque la classe tente de créer le StoreController sans envoyer l’objet de service, car aucun constructeur sans paramètre n’est déclaré.

Tâche 1 : Exécution de l’application

Dans cette tâche, vous allez exécuter l’application Begin, qui inclut le service dans le contrôleur de magasin qui sépare l’accès aux données de la logique d’application.

Lors de l’exécution de l’application, vous recevez une exception, car le service du contrôleur n’est pas passé en tant que paramètre par défaut :

  1. Ouvrez la solution Begin située dans Source\Ex01-Injecting Controller\Begin.

    1. Vous devrez télécharger certains packages NuGet manquants avant de continuer. Pour ce faire, cliquez sur le menu Projet et sélectionnez Gérer les packages NuGet.

    2. Dans la boîte de dialogue Gérer les packages NuGet , cliquez sur Restaurer pour télécharger les packages manquants.

    3. Enfin, générez la solution en cliquant sur Générer | la solution.

      Notes

      L’un des avantages de l’utilisation de NuGet est que vous n’avez pas besoin d’expédier toutes les bibliothèques de votre projet, ce qui réduit la taille du projet. Avec NuGet Power Tools, en spécifiant les versions du package dans le fichier Packages.config, vous pouvez télécharger toutes les bibliothèques requises la première fois que vous exécutez le projet. C’est pourquoi vous devrez exécuter ces étapes après avoir ouvert une solution existante à partir de ce labo.

  2. Appuyez sur Ctrl + F5 pour exécuter l’application sans débogage. Vous recevez le message d’erreur « Aucun constructeur sans paramètre défini pour cet objet » :

    Erreur lors de l’exécution de ASP.NET erreur de début de l’application MVC

    Erreur lors de l’exécution de ASP.NET application de début MVC

  3. Fermez le navigateur.

Dans les étapes suivantes, vous allez travailler sur la solution de magasin de musique pour injecter la dépendance dont ce contrôleur a besoin.

Tâche 2 : Inclure Unity dans la solution MvcMusicStore

Dans cette tâche, vous allez inclure le package NuGet Unity.Mvc3 à la solution.

Notes

Le package Unity.Mvc3 a été conçu pour ASP.NET MVC 3, mais il est entièrement compatible avec ASP.NET MVC 4.

Unity est un conteneur d’injection de dépendances léger et extensible avec une prise en charge facultative des instance et de l’interception de type. Il s’agit d’un conteneur à usage général qui peut être utilisé dans n’importe quel type d’application .NET. Il fournit toutes les fonctionnalités courantes trouvées dans les mécanismes d’injection de dépendances, notamment la création d’objets, l’abstraction des exigences en spécifiant les dépendances au moment de l’exécution et la flexibilité, en reportant la configuration du composant au conteneur.

  1. Installez le package NuGet Unity.Mvc3 dans le projet MvcMusicStore . Pour ce faire, ouvrez la console du Gestionnaire de package à partir de Afficher d’autres | fenêtres.

  2. Exécutez la commande suivante :

    PMC

    Install-Package Unity.Mvc3
    

    Installation du package NuGet Unity.Mvc3

    Installation du package NuGet Unity.Mvc3

  3. Une fois le package Unity.Mvc3 installé, explorez les fichiers et dossiers qu’il ajoute automatiquement afin de simplifier la configuration d’Unity.

    Package Unity.Mvc3 installé Package

    Package Unity.Mvc3 installé

Tâche 3 : Inscription d’Unity dans global.asax.cs Application_Start

Dans cette tâche, vous allez mettre à jour la méthode Application_Start située dans Global.asax.cs pour appeler l’initialiseur du programme d’amorçage Unity, puis mettre à jour le fichier de programme d’amorçage en inscrivant le service et le contrôleur que vous utiliserez pour l’injection de dépendances.

  1. À présent, vous allez raccorder le programme d’amorçage, qui est le fichier qui initialise le conteneur Unity et le programme de résolution de dépendances. Pour ce faire, ouvrez Global.asax.cs et ajoutez le code mis en surbrillance suivant dans la méthode Application_Start .

    (Extrait de code - ASP.NET Laboratoire d’injection de dépendances - Ex01 - Initialiser Unity)

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
    
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    
        Bootstrapper.Initialise();
    
        AppConfig.Configure();
    }
    
  2. Ouvrez le fichier Bootstrapper.cs .

  3. Incluez les espaces de noms suivants : MvcMusicStore.Services et MusicStore.Controllers.

    (Extrait de code - ASP.NET Laboratoire d’injection de dépendances - Ex01 - Programme d’amorçage Ajout d’espaces de noms)

    using System.Web.Mvc;
    using Microsoft.Practices.Unity;
    using Unity.Mvc3;
    using MvcMusicStore.Services;
    using MvcMusicStore.Controllers;
    
  4. Remplacez le contenu de la méthode BuildUnityContainer par le code suivant qui inscrit Store Controller et Store Service.

    (Extrait de code - ASP.NET Laboratoire d’injection de dépendances - Ex01 - Inscrire le contrôleur de magasin et le service)

    private static IUnityContainer BuildUnityContainer()
    {
        var container = new UnityContainer();
    
        container.RegisterType<IStoreService, StoreService>();
        container.RegisterType<IController, StoreController>("Store");
    
        return container;
    }
    

Tâche 4 : Exécution de l’application

Dans cette tâche, vous allez exécuter l’application pour vérifier qu’elle peut maintenant être chargée après avoir inclus Unity.

  1. Appuyez sur F5 pour exécuter l’application. L’application doit maintenant se charger sans afficher de message d’erreur.

    Exécution d’une application avec injection de dépendances

    Exécution d’une application avec injection de dépendances

  2. Accédez à /Store. Cela appelleRa StoreController, qui est maintenant créé à l’aide d’Unity.

    Magasin de musique MVC

    Magasin de musique MVC

  3. Fermez le navigateur.

Dans les exercices suivants, vous allez apprendre à étendre l’étendue d’injection de dépendances pour l’utiliser dans ASP.NET vues et filtres d’action MVC.

Exercice 2 : Injection d’une vue

Dans cet exercice, vous allez apprendre à utiliser l’injection de dépendances dans une vue avec les nouvelles fonctionnalités de ASP.NET MVC 4 pour l’intégration d’Unity. Pour ce faire, vous devez appeler un service personnalisé à l’intérieur de la vue De navigation dans le Windows Store, qui affiche un message et une image ci-dessous.

Ensuite, vous allez intégrer le projet à Unity et créer un programme de résolution de dépendances personnalisé pour injecter les dépendances.

Tâche 1 : Création d’une vue qui consomme un service

Dans cette tâche, vous allez créer une vue qui effectue un appel de service pour générer une nouvelle dépendance. Le service se compose d’un service de messagerie simple inclus dans cette solution.

  1. Ouvrez la solution Begin située dans le dossier Source\Ex02-Injecting View\Begin . Sinon, vous pouvez continuer à utiliser la solution End obtenue en effectuant l’exercice précédent.

    1. Si vous avez ouvert la solution Begin fournie, vous devez télécharger certains packages NuGet manquants avant de continuer. Pour ce faire, cliquez sur le menu Projet et sélectionnez Gérer les packages NuGet.

    2. Dans la boîte de dialogue Gérer les packages NuGet , cliquez sur Restaurer pour télécharger les packages manquants.

    3. Enfin, générez la solution en cliquant sur Générer | la solution.

      Notes

      L’un des avantages de l’utilisation de NuGet est que vous n’avez pas à livrer toutes les bibliothèques de votre projet, ce qui réduit la taille du projet. Avec NuGet Power Tools, en spécifiant les versions de package dans le fichier Packages.config, vous pourrez télécharger toutes les bibliothèques requises la première fois que vous exécutez le projet. C’est pourquoi vous devrez exécuter ces étapes après avoir ouvert une solution existante à partir de ce labo.

      Pour plus d’informations, consultez cet article : https://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages.

  2. Incluez les classes MessageService.cs et IMessageService.cs situées dans le dossier Source \Assets dans /Services. Pour ce faire, cliquez avec le bouton droit sur le dossier Services et sélectionnez Ajouter un élément existant. Accédez à l’emplacement des fichiers et incluez-les.

    Ajout d’un service de message et d’une interface de service

    Ajout d’un service de message et d’une interface de service

    Notes

    L’interface IMessageService définit deux propriétés implémentées par la classe MessageService. Ces propriétés -Message et ImageUrl- stockent le message et l’URL de l’image à afficher.

  3. Créez le dossier /Pages dans le dossier racine du projet, puis ajoutez la classe existante MyBasePage.cs à partir de Source\Assets. La page de base dont vous héritez a la structure suivante.

    Dossier Pages

    namespace MvcMusicStore.Pages
    {
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Web;
        using Microsoft.Practices.Unity;
        using MvcMusicStore.Models;
        using MvcMusicStore.Services;
    
        public class MyBasePage : System.Web.Mvc.WebViewPage<Genre>
        {
            [Dependency]
            public IMessageService MessageService { get; set; }
    
            public override void 
    
            Execute()
            {
            }
        }
    }
    
  4. Ouvrez l’affichage Browse.cshtml à partir du dossier /Views/Store et faites-le hériter de MyBasePage.cs.

    @inherits MvcMusicStore.Pages.MyBasePage
    @{
         ViewBag.Title = "Browse Albums";
    }
    
  5. Dans la vue Parcourir , ajoutez un appel à MessageService pour afficher une image et un message récupérés par le service. (C#)

    @inherits MvcMusicStore.Pages.MyBasePage    
    @{
        Viewbag.Title = "Browse Albums";
    }
    <div>
        @this.MessageService.Message
        <br />
        <img alt="@this.MessageService.Message" src="@this.MessageService.ImageUrl" />
    </div>
    ...
    

Tâche 2 : Inclure un programme de résolution de dépendances personnalisé et un activateur de page d’affichage personnalisé

Dans la tâche précédente, vous avez injecté une nouvelle dépendance à l’intérieur d’une vue pour y effectuer un appel de service. À présent, vous allez résoudre cette dépendance en implémentant les interfaces d’injection de dépendances ASP.NET MVC IViewPageActivator et IDependencyResolver. Vous allez inclure dans la solution une implémentation de IDependencyResolver qui traitera la récupération du service à l’aide d’Unity. Ensuite, vous allez inclure une autre implémentation personnalisée de l’interface IViewPageActivator qui résout la création des vues.

Notes

Depuis ASP.NET MVC 3, l’implémentation de l’injection de dépendances a simplifié les interfaces d’inscription des services. IDependencyResolver et IViewPageActivator font partie de ASP.NET fonctionnalités MVC 3 pour l’injection de dépendances.

- L’interface IDependencyResolver remplace l’IMvcServiceLocator précédent. Les implémenteurs d’IDependencyResolver doivent retourner un instance du service ou d’une collection de services.

public interface IDependencyResolver {
    object GetService(Type serviceType);
    IEnumerable<object> GetServices(Type serviceType);
}

- L’interface IViewPageActivator offre un contrôle plus précis sur la façon dont les pages d’affichage sont instanciées via l’injection de dépendances. Les classes qui implémentent l’interface IViewPageActivator peuvent créer des instances d’affichage à l’aide d’informations de contexte.

public interface IViewPageActivator {
    object Create(ControllerContext controllerContext, Type type);
}
  1. Créez le dossier /Factories dans le dossier racine du projet.

  2. Incluez CustomViewPageActivator.cs dans votre solution à partir de /Sources/Assets/ dans le dossier Fabriques . Pour ce faire, cliquez avec le bouton droit sur le dossier /Factories , sélectionnez Ajouter | Élément existant , puis sélectionnez CustomViewPageActivator.cs. Cette classe implémente l’interface IViewPageActivator pour contenir le conteneur Unity.

    namespace MvcMusicStore.Factories
    {
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Web;
        using System.Web.Mvc;
        using Microsoft.Practices.Unity;
    
        public class CustomViewPageActivator : IViewPageActivator
        {
            private IUnityContainer container;
    
            public CustomViewPageActivator(IUnityContainer container)
            {
                this.container = container;
            }
    
            public object Create(ControllerContext controllerContext, Type type)
            {
                return this.container.Resolve(type);
            }
        }
    }
    

    Notes

    CustomViewPageActivator est responsable de la gestion de la création d’une vue à l’aide d’un conteneur Unity.

  3. Incluez le fichier UnityDependencyResolver.cs de /Sources/Assets dans le dossier /Factories . Pour ce faire, cliquez avec le bouton droit sur le dossier /Factories , sélectionnez Ajouter | Élément existant , puis sélectionnez le fichier UnityDependencyResolver.cs .

    namespace MvcMusicStore.Factories
    {
         using System;
         using System.Collections.Generic;
         using System.Linq;
         using System.Web;
         using System.Web.Mvc;
         using Microsoft.Practices.Unity;
    
         public class UnityDependencyResolver : IDependencyResolver
         {
              private IUnityContainer container;
    
              private IDependencyResolver resolver;
    
              public UnityDependencyResolver(IUnityContainer container, IDependencyResolver resolver)
              {
                    this.container = container;
                    this.resolver = resolver;
              }
    
              public object GetService(Type serviceType)
              {
                    try
                    {
                         return this.container.Resolve(serviceType);
                    }
                    catch
                    {
                         return this.resolver.GetService(serviceType);
                    }
              }
    
              public IEnumerable<object> GetServices(Type serviceType)
              {
                    try
                    {
                         return this.container.ResolveAll(serviceType);
                    }
                    catch
                    {
                         return this.resolver.GetServices(serviceType);
                    }
              }
         }
    }
    

    Notes

    La classe UnityDependencyResolver est un DependencyResolver personnalisé pour Unity. Lorsqu’un service est introuvable dans le conteneur Unity, le programme de résolution de base est appelé.

Dans la tâche suivante, les deux implémentations sont inscrites pour indiquer au modèle l’emplacement des services et des vues.

Tâche 3 : Inscription pour l’injection de dépendances dans le conteneur Unity

Dans cette tâche, vous allez regrouper tous les éléments précédents pour que l’injection de dépendances fonctionne.

Jusqu’à présent, votre solution comporte les éléments suivants :

  • Vue Parcourir qui hérite de MyBaseClass et consomme MessageService.
  • Classe intermédiaire -MyBaseClass- pour laquelle l’injection de dépendances est déclarée pour l’interface de service.
  • Un service - MessageService - et son interface IMessageService.
  • Un programme de résolution de dépendances personnalisé pour Unity - UnityDependencyResolver - qui traite de la récupération de service.
  • Un activateur de page d’affichage - CustomViewPageActivator - qui crée la page.

Pour injecter l’affichage Parcourir , vous allez maintenant inscrire le programme de résolution de dépendances personnalisé dans le conteneur Unity.

  1. Ouvrez le fichier Bootstrapper.cs .

  2. Inscrivez un instance de MessageService dans le conteneur Unity pour initialiser le service :

    (Code Snippet - ASP.NET Dependency Injection Lab - Ex02 - Register Message Service)

    private static IUnityContainer BuildUnityContainer()
    {
        var container = new UnityContainer();
    
        container.RegisterType<IStoreService, StoreService>();
        container.RegisterType<IController, StoreController>("Store");
    
        container.RegisterInstance<IMessageService>(new MessageService
        {
            Message = "You are welcome to our Web Camps Training Kit!",
            ImageUrl = "/Content/Images/webcamps.png"
        });
        //...
    }
    
  3. Ajoutez une référence à l’espace de noms MvcMusicStore.Factories .

    (Code Snippet - ASP.NET Dependency Injection Lab - Ex02 - Factories Namespace)

    using System.Web.Mvc; 
    using Microsoft.Practices.Unity; 
    using Unity.Mvc3; 
    using MvcMusicStore.Services; 
    using MvcMusicStore.Controllers; 
    using MvcMusicStore.Factories;
    
  4. Inscrivez CustomViewPageActivator en tant qu’activateur de page d’affichage dans le conteneur Unity :

    (Extrait de code - ASP.NET Laboratoire d’injection de dépendances - Ex02 - Inscrire CustomViewPageActivator)

    private static IUnityContainer BuildUnityContainer()
    {
        var container = new UnityContainer();
    
        container.RegisterType<IStoreService, StoreService>();
        container.RegisterType<IController, StoreController>("Store");
    
        container.RegisterInstance<IMessageService>(new MessageService
        {
            Message = "You are welcome to our Web Camps Training Kit!",
            ImageUrl = "/Content/Images/webcamps.png"
        });
    
        container.RegisterType<IViewPageActivator, CustomViewPageActivator>(new InjectionConstructor(container));
    
        return container;
    }
    
  5. Remplacez ASP.NET programme de résolution de dépendances par défaut MVC 4 par un instance unityDependencyResolver. Pour ce faire, remplacez le contenu de la méthode Initialize par le code suivant :

    (Code Snippet - ASP.NET Dependency Injection Lab - Ex02 - Update Dependency Resolver)

    public static void Initialise()
    {
        var container = BuildUnityContainer();
    
        DependencyResolver.SetResolver(new Unity.Mvc3.UnityDependencyResolver(container));
    
        IDependencyResolver resolver = DependencyResolver.Current;
    
        IDependencyResolver newResolver = new Factories.UnityDependencyResolver(container, resolver);
    
        DependencyResolver.SetResolver(newResolver);
    }
    

    Notes

    ASP.NET MVC fournit une classe de résolveur de dépendances par défaut. Pour utiliser des résolveurs de dépendances personnalisés comme ceux que nous avons créés pour Unity, ce programme de résolution doit être remplacé.

Tâche 4 : Exécution de l’application

Dans cette tâche, vous allez exécuter l’application pour vérifier que le Navigateur du Windows Store consomme le service et affiche l’image et le message récupérés :

  1. Appuyez sur F5 pour exécuter l'application.

  2. Cliquez sur Rock dans le menu Genres et voyez comment MessageService a été injecté dans la vue et chargé le message d’accueil et l’image. Dans cet exemple, nous entrons dans « Rock » :

    Magasin de musique MVC - Injection d’affichage

    Magasin de musique MVC - Injection d’affichage

  3. Fermez le navigateur.

Exercice 3 : Injecter des filtres d’action

Dans le Hands-On laboratoire précédent , vous avez travaillé avec la personnalisation et l’injection des filtres. Dans cet exercice, vous allez apprendre à injecter des filtres avec l’injection de dépendances à l’aide du conteneur Unity. Pour ce faire, vous allez ajouter à la solution du Magasin de musique un filtre d’action personnalisé qui tracera l’activité du site.

Tâche 1 : Inclure le filtre de suivi dans la solution

Dans cette tâche, vous allez inclure dans le Magasin de musique un filtre d’action personnalisé pour suivre les événements. Comme les concepts de filtre d’action personnalisée sont déjà traités dans le labo précédent « Filtres d’actions personnalisées », vous allez simplement inclure la classe de filtre à partir du dossier Assets de ce labo, puis créer un fournisseur de filtres pour Unity :

  1. Ouvrez la solution Begin située dans le dossier Source\Ex03 - Injecting Action Filter\Begin . Sinon, vous pouvez continuer à utiliser la solution End obtenue en effectuant l’exercice précédent.

    1. Si vous avez ouvert la solution Begin fournie, vous devez télécharger certains packages NuGet manquants avant de continuer. Pour ce faire, cliquez sur le menu Projet et sélectionnez Gérer les packages NuGet.

    2. Dans la boîte de dialogue Gérer les packages NuGet , cliquez sur Restaurer pour télécharger les packages manquants.

    3. Enfin, générez la solution en cliquant sur Générer | la solution.

      Notes

      L’un des avantages de l’utilisation de NuGet est que vous n’avez pas à livrer toutes les bibliothèques de votre projet, ce qui réduit la taille du projet. Avec NuGet Power Tools, en spécifiant les versions de package dans le fichier Packages.config, vous pourrez télécharger toutes les bibliothèques requises la première fois que vous exécutez le projet. C’est pourquoi vous devrez exécuter ces étapes après avoir ouvert une solution existante à partir de ce labo.

      Pour plus d’informations, consultez cet article : https://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages.

  2. Incluez le fichier TraceActionFilter.cs de /Sources/Assets dans le dossier /Filters .

    namespace MvcMusicStore.Filters
    {
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Web;
        using System.Web.Mvc;
    
        public class TraceActionFilter : IActionFilter
        {
            public void OnActionExecuted(ActionExecutedContext filterContext)
            {
                filterContext.HttpContext.Trace.Write("OnActionExecuted");
                filterContext.HttpContext.Trace.Write("Action " + filterContext.ActionDescriptor.ActionName);
                filterContext.HttpContext.Trace.Write("Controller " + filterContext.ActionDescriptor.ControllerDescriptor.ControllerName);
            }
    
            public void OnActionExecuting(ActionExecutingContext filterContext)
            {
                filterContext.HttpContext.Trace.Write("OnActionExecuting");
                filterContext.HttpContext.Trace.Write("Action " + filterContext.ActionDescriptor.ActionName);
                filterContext.HttpContext.Trace.Write("Controller " + filterContext.ActionDescriptor.ControllerDescriptor.ControllerName);
            }
        }
    }
    

    Notes

    Ce filtre d’action personnalisé effectue ASP.NET suivi. Vous pouvez case activée labo « filtres d’action locale et dynamique ASP.NET MVC 4 » pour plus de référence.

  3. Ajoutez la classe vide FilterProvider.cs au projet dans le dossier /Filters.

  4. Ajoutez les espaces de noms System.Web.Mvc et Microsoft.Practices.Unity dans FilterProvider.cs.

    (Extrait de code - ASP.NET Laboratoire d’injection de dépendances - Ex03 - Fournisseur de filtres ajout d’espaces de noms)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using Microsoft.Practices.Unity;
    
    namespace MvcMusicStore.Filters
    {
         public class FilterProvider
         {
         }
    }
    
  5. Faites en sorte que la classe hérite de l’interface IFilterProvider .

    namespace MvcMusicStore.Filters
    {
        public class FilterProvider : IFilterProvider
        {
        }
    }
    
  6. Ajoutez une propriété IUnityContainer dans la classe FilterProvider , puis créez un constructeur de classe pour affecter le conteneur.

    (Extrait de code - ASP.NET Laboratoire d’injection de dépendances - Ex03 - Constructeur de fournisseur de filtres)

    public class FilterProvider : IFilterProvider
    {
        private IUnityContainer container;
    
        public FilterProvider(IUnityContainer container)
        {
            this.container = container;
        }
    }
    

    Notes

    Le constructeur de classe de fournisseur de filtres ne crée pas d’objet à l’intérieur. Le conteneur est passé en tant que paramètre et la dépendance est résolue par Unity.

  7. Dans la classe FilterProvider , implémentez la méthode GetFilters à partir de l’interface IFilterProvider .

    (Extrait de code - ASP.NET Laboratoire d’injection de dépendances - Ex03 - GetFilters du fournisseur de filtres)

    public class FilterProvider : IFilterProvider
    {
        private IUnityContainer container;
    
        public FilterProvider(IUnityContainer container)
        {
            this.container = container;
        }
    
        public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
        {
            foreach (IActionFilter actionFilter in this.container.ResolveAll<IActionFilter>())
            {
                yield return new Filter(actionFilter, FilterScope.First, null);
            }
        }
    }
    

Tâche 2 : Inscription et activation du filtre

Dans cette tâche, vous allez activer le suivi de site. Pour ce faire, vous allez inscrire le filtre dans la méthode Bootstrapper.cs BuildUnityContainer pour démarrer le suivi :

  1. Ouvrez Web.config situé à la racine du projet et activez le suivi des traces dans le groupe System.Web.

    <system.web>
        <trace enabled="true"/>
        <compilation debug="true" targetFramework="4.5">
    
  2. Ouvrez Bootstrapper.cs à la racine du projet.

  3. Ajoutez une référence à l’espace de noms MvcMusicStore.Filters .

    (Extrait de code - ASP.NET Laboratoire d’injection de dépendances - Ex03 - Programme d’amorçage Ajout d’espaces de noms)

    using System.Web.Mvc;
    using Microsoft.Practices.Unity;
    using Unity.Mvc3;
    using MvcMusicStore.Services;
    using MvcMusicStore.Controllers;
    using MvcMusicStore.Factories;
    using MvcMusicStore.Filters;
    
  4. Sélectionnez la méthode BuildUnityContainer et inscrivez le filtre dans le conteneur Unity. Vous devez inscrire le fournisseur de filtres ainsi que le filtre d’action.

    (Code Snippet - ASP.NET Dependency Injection Lab - Ex03 - Register FilterProvider et ActionFilter)

    private static IUnityContainer BuildUnityContainer()
    {
        var container = new UnityContainer();
    
        //...
    
        container.RegisterInstance<IFilterProvider>("FilterProvider", new FilterProvider(container));
        container.RegisterInstance<IActionFilter>("LogActionFilter", new TraceActionFilter());
    
        return container;
    }
    

Tâche 3 - Exécution de l’application

Dans cette tâche, vous allez exécuter l’application et tester que le filtre d’action personnalisé suit l’activité :

  1. Appuyez sur F5 pour exécuter l'application.

  2. Cliquez sur Rock dans le menu Genres. Vous pouvez accéder à d’autres genres si vous le souhaitez.

    Music Store

    Magasin de musique

  3. Accédez à /Trace.axd pour afficher la page Trace de l’application, puis cliquez sur Afficher les détails.

    Journal de trace

    Journal des traces d’application

    Trace d’application - Détails de la demande

    Trace d’application - Détails de la demande

  4. Fermez le navigateur.


Résumé

En effectuant ce Hands-On Lab, vous avez appris à utiliser l’injection de dépendances dans ASP.NET MVC 4 en intégrant Unity à l’aide d’un package NuGet. Pour ce faire, vous avez utilisé l’injection de dépendances à l’intérieur des contrôleurs, des vues et des filtres d’action.

Les concepts suivants ont été abordés :

  • fonctionnalités d’injection de dépendances ASP.NET MVC 4
  • Intégration Unity à l’aide du package NuGet Unity.Mvc3
  • Injection de dépendances dans les contrôleurs
  • Injection de dépendances dans les vues
  • Injection de dépendances de filtres d’action

Annexe A : Installation de Visual Studio Express 2012 pour le web

Vous pouvez installer Microsoft Visual Studio Express 2012 pour le web ou une autre version « Express » à l’aide de la Microsoft Web Platform Installer. Les instructions suivantes vous guident tout au long des étapes requises pour installer Visual Studio Express 2012 pour le web à l’aide de Microsoft Web Platform Installer.

  1. Atteindre https://go.microsoft.com/?linkid=9810169. Sinon, si vous avez déjà installé Web Platform Installer, vous pouvez l’ouvrir et rechercher le produit « Visual Studio Express 2012 pour le web avec le Kit de développement logiciel (SDK) Windows Azure ».

  2. Cliquez sur Installer maintenant. Si vous n’avez pas web Platform Installer , vous serez redirigé pour le télécharger et l’installer en premier.

  3. Une fois le programme d’installation de la plateforme web ouvert, cliquez sur Installer pour démarrer le programme d’installation.

    Installer Visual Studio Express

    Installer Visual Studio Express

  4. Lisez les licences et conditions de tous les produits, puis cliquez sur J’accepte pour continuer.

    Acceptation des termes du contrat de licence

    Acceptation des termes du contrat de licence

  5. Attendez que le téléchargement et l’installation se terminent.

    Progression de l’installation

    Progression de l’installation

  6. Une fois l’installation terminée, cliquez sur Terminer.

    Installation terminée

    Installation terminée

  7. Cliquez sur Quitter pour fermer Web Platform Installer.

  8. Pour ouvrir Visual Studio Express pour le web, accédez à l’écran d’accueil et commencez à écrire « VS Express », puis cliquez sur la vignette VS Express pour le web.

    Vignette VS Express pour le web

    Vignette VS Express pour le web

Annexe B : Utilisation d’extraits de code

Avec les extraits de code, vous avez tout le code dont vous avez besoin à portée de main. Le document lab vous indique exactement quand vous pouvez les utiliser, comme illustré dans la figure suivante.

Utilisation d’extraits de code Visual Studio pour insérer du code dans votre projet

Utilisation d’extraits de code Visual Studio pour insérer du code dans votre projet

Pour ajouter un extrait de code à l’aide du clavier (C# uniquement)

  1. Placez le curseur à l’emplacement où vous souhaitez insérer le code.
  2. Commencez à taper le nom de l’extrait de code (sans espaces ni traits d’union).
  3. Regardez qu’IntelliSense affiche les noms des extraits de code correspondants.
  4. Sélectionnez l’extrait de code correct (ou continuez à taper jusqu’à ce que le nom de l’extrait de code entier soit sélectionné).
  5. Appuyez deux fois sur Tab pour insérer l’extrait de code à l’emplacement du curseur.

Commencer à taper le nom de l’extrait de code

Commencer à taper le nom de l’extrait de code

Appuyez sur Tab pour sélectionner l’extrait de code mis en surbrillance

Appuyez sur Tab pour sélectionner l’extrait de code mis en surbrillance

Appuyez de nouveau sur Tab pour que l’extrait de code développe

Appuyez de nouveau sur Tab pour que l’extrait de code se développe.

Pour ajouter un extrait de code à l’aide de la souris (C#, Visual Basic et XML) 1. Cliquez avec le bouton droit à l’emplacement où vous souhaitez insérer l’extrait de code.

  1. Sélectionnez Insérer un extrait de code , puis Mes extraits de code.
  2. Sélectionnez l’extrait de code approprié dans la liste, en cliquant dessus.

Cliquez avec le bouton droit à l’emplacement où vous souhaitez insérer l’extrait de code, puis sélectionnez Insérer un extrait de

Cliquez avec le bouton droit à l’emplacement où vous souhaitez insérer l’extrait de code, puis sélectionnez Insérer un extrait de code

Choisissez l’extrait de code approprié dans la liste, en cliquant dessus

Sélectionnez l’extrait de code approprié dans la liste, en cliquant dessus