Share via


Inserimento di dipendenze di ASP.NET MVC 4

Per il team dei campi Web

Scaricare Il kit di training per i campi Web

Questo lab pratico presuppone che si abbia una conoscenza di base di ASP.NET MVC e ASP.NET filtri MVC 4. Se non sono stati usati ASP.NET filtri MVC 4 in precedenza, è consigliabile passare a ASP.NET lab pratico per i filtri di azione personalizzati MVC .

Nota

Tutti i frammenti e il codice di esempio sono inclusi nel Kit di training dei campi Web, disponibili in Microsoft-Web/WebCampTrainingKit Release. Il progetto specifico per questo lab è disponibile in ASP.NET MVC 4 Dependency Injection.

Nel paradigma di programmazione orientata agli oggetti gli oggetti interagiscono in un modello di collaborazione in cui sono presenti collaboratori e consumer. Naturalmente, questo modello di comunicazione genera dipendenze tra oggetti e componenti, diventando difficile da gestire quando aumenta la complessità.

Dipendenze di classi e dipendenze della classe di

Dipendenze della classe e complessità del modello

Probabilmente si è sentito parlare del modello factory e della separazione tra l'interfaccia e l'implementazione usando i servizi, dove gli oggetti client sono spesso responsabili della posizione del servizio.

Il modello di inserimento delle dipendenze è una particolare implementazione di Inversion of Control. L'inversione del controllo (IoC) significa che gli oggetti non creano altri oggetti su cui si basano per eseguire il loro lavoro. Ottiene invece gli oggetti necessari da un'origine esterna,ad esempio un file di configurazione xml.

L'inserimento delle dipendenze indica che questa operazione viene eseguita senza l'intervento dell'oggetto, in genere da un componente framework che passa i parametri del costruttore e imposta le proprietà.

Modello di progettazione DI (Dependency Injection)

A livello generale, l'obiettivo di Dependency Injection è che una classe client (ad esempio il golfer) necessita di qualcosa che soddisfi un'interfaccia (ad esempio IClub). Non importa cosa sia il tipo di cemento (ad esempio WoodClub, IronClub, WedgeClub o PutterClub), vuole che un altro utente possa gestire tale tipo (ad esempio un buon caddy). Il sistema di risoluzione delle dipendenze in ASP.NET MVC può consentire di registrare la logica di dipendenza in un altro punto (ad esempio un contenitore o un contenitore di club).

Illustrazione di inserimento delle dipendenze del diagramma di inserimento delle dipendenze

Inserimento delle dipendenze - Analogia golf

I vantaggi dell'uso del modello di inserimento delle dipendenze e dell'inversione del controllo sono i seguenti:

  • Riduce l'accoppiamento della classe
  • Aumenta il riutilizzo del codice
  • Migliora la gestibilità del codice
  • Migliora i test dell'applicazione

Nota

L'inserimento delle dipendenze viene talvolta confrontato con il modello di progettazione astratta factory, ma esiste una leggera differenza tra entrambi gli approcci. DI ha un framework che lavora dietro per risolvere le dipendenze chiamando le factory e i servizi registrati.

Ora che si comprende il modello di inserimento delle dipendenze, si apprenderà in questo lab come applicarlo in ASP.NET MVC 4. Si inizierà a usare l'inserimento delle dipendenze nei controller per includere un servizio di accesso al database. Verrà quindi applicato l'inserimento delle dipendenze alle visualizzazioni per l'utilizzo di un servizio e la visualizzazione delle informazioni. Infine, si estenderà l'operazione DI a ASP.NET filtri MVC 4, inserendo un filtro di azione personalizzato nella soluzione.

In questo lab pratico si apprenderà come:

  • Integrare ASP.NET MVC 4 con Unity per l'inserimento delle dipendenze tramite pacchetti NuGet
  • Usare l'inserimento delle dipendenze all'interno di un controller MVC ASP.NET
  • Usare l'inserimento delle dipendenze all'interno di una visualizzazione MVC ASP.NET
  • Usare l'inserimento delle dipendenze all'interno di un filtro azione MVC ASP.NET

Nota

Questo lab usa il pacchetto NuGet Unity.Mvc3 per la risoluzione delle dipendenze, ma è possibile adattare qualsiasi framework di inserimento delle dipendenze per lavorare con ASP.NET MVC 4.

Prerequisiti

Per completare questo lab, è necessario disporre degli elementi seguenti:

Installazione

Installazione di frammenti di codice

Per praticità, gran parte del codice che si gestirà lungo questo lab è disponibile come frammenti di codice di Visual Studio. Per installare i frammenti di codice, eseguire il file .\Source\Setup\CodeSnippets.vsi .

Se non si ha familiarità con i frammenti di codice di Visual Studio e si vuole imparare a usarli, è possibile fare riferimento all'appendice di questo documento "Appendice B: Uso dei frammenti di codice".


Esercizi

Questo lab di Hands-On è costituito dagli esercizi seguenti:

  1. Esercizio 1: Inserimento di un controller
  2. Esercizio 2: Inserimento di una visualizzazione
  3. Esercizio 3: Inserimento di filtri

Nota

Ogni esercizio è accompagnato da una cartella End contenente la soluzione risultante da ottenere dopo aver completato gli esercizi. È possibile usare questa soluzione come guida se sono necessarie ulteriori informazioni su come usare gli esercizi.

Tempo stimato per completare questo lab: 30 minuti.

Esercizio 1: Inserimento di un controller

In questo esercizio si apprenderà come usare l'inserimento delle dipendenze in ASP.NET controller MVC integrando Unity usando un pacchetto NuGet. Per questo motivo, i servizi verranno inclusi nei controller MvcMusicStore per separare la logica dall'accesso ai dati. I servizi creeranno una nuova dipendenza nel costruttore del controller, che verrà risolto usando l'inserimento delle dipendenze con l'aiuto di Unity.

Questo approccio illustra come generare applicazioni meno associate, che sono più flessibili e più facili da gestire e testare. Si apprenderà anche come integrare ASP.NET MVC con Unity.

Informazioni sul servizio StoreManager

MVC Music Store fornito nella soluzione di inizio include ora un servizio che gestisce i dati del controller di archiviazione denominati StoreService. Di seguito è disponibile l'implementazione del servizio di Archiviazione. Si noti che tutti i metodi restituiscono entità 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 dalla soluzione di inizio usa ora StoreService. Tutti i riferimenti ai dati sono stati rimossi da StoreController e ora è possibile modificare il provider di accesso ai dati corrente senza modificare alcun metodo che usa StoreService.

Di seguito è riportato che l'implementazione di StoreController ha una dipendenza con StoreService all'interno del costruttore della classe.

Nota

La dipendenza introdotta in questo esercizio è correlata all'inversione del controllo (IoC).

Il costruttore della classe StoreController riceve un parametro di tipo IStoreService , essenziale per eseguire chiamate di servizio dall'interno della classe. StoreController, tuttavia, non implementa il costruttore predefinito (senza parametri) che qualsiasi controller deve usare ASP.NET MVC.

Per risolvere la dipendenza, il controller deve essere creato da una factory astratta (una classe che restituisce qualsiasi oggetto del tipo specificato).

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);
        }
    }
}

Nota

Verrà visualizzato un errore quando la classe tenta di creare StoreController senza inviare l'oggetto servizio, perché non è stato dichiarato alcun costruttore senza parametri.

Attività 1 - Esecuzione dell'applicazione

In questa attività si eseguirà l'applicazione Begin, che include il servizio nel controller di archiviazione che separa l'accesso ai dati dalla logica dell'applicazione.

Quando si esegue l'applicazione, si riceverà un'eccezione, poiché il servizio controller non viene passato come parametro per impostazione predefinita:

  1. Aprire la soluzione Begin disponibile in Source\Ex01-Injecting Controller\Begin.

    1. È necessario scaricare alcuni pacchetti NuGet mancanti prima di continuare. A tale scopo, fare clic sul menu Progetto e selezionare Gestisci pacchetti NuGet.

    2. Nella finestra di dialogo Gestisci pacchetti NuGet fare clic su Ripristina per scaricare pacchetti mancanti.

    3. Compilare infine la soluzione facendo clic su Compila | soluzione.

      Nota

      Uno dei vantaggi dell'uso di NuGet è che non è necessario inviare tutte le librerie nel progetto, riducendo le dimensioni del progetto. Con NuGet Power Tools, specificando le versioni del pacchetto nel file Packages.config, sarà possibile scaricare tutte le librerie necessarie la prima volta che si esegue il progetto. Questo è il motivo per cui è necessario eseguire questi passaggi dopo aver aperto una soluzione esistente da questo lab.

  2. Premere CTRL + F5 per eseguire l'applicazione senza eseguire il debug. Verrà visualizzato il messaggio di errore "Nessun costruttore senza parametri definito per questo oggetto":

    Errore durante l'esecuzione ASP.NET errore dell'applicazione di inizio

    Errore durante l'esecuzione dell'applicazione MVC Begin ASP.NET

  3. Chiudere il browser.

Nei passaggi seguenti si lavorerà sulla soluzione Music Store per inserire la dipendenza necessaria da questo controller.

Attività 2 - Incluso Unity nella soluzione MvcMusicStore

In questa attività si includerà Il pacchetto NuGet Unity.Mvc3 alla soluzione.

Nota

Il pacchetto Unity.Mvc3 è stato progettato per ASP.NET MVC 3, ma è completamente compatibile con ASP.NET MVC 4.

Unity è un contenitore di inserimento di dipendenze leggero ed estendibile con supporto facoltativo per l'istanza e l'intercettazione dei tipi. Si tratta di un contenitore per utilizzo generico per l'uso in qualsiasi tipo di applicazione .NET. Fornisce tutte le funzionalità comuni disponibili nei meccanismi di inserimento delle dipendenze, tra cui: creazione di oggetti, astrazione dei requisiti specificando le dipendenze in fase di esecuzione e flessibilità, rinviando la configurazione del componente al contenitore.

  1. Installare il pacchetto NuGet Unity.Mvc3 nel progetto MvcMusicStore . A tale scopo, aprire la console di Gestione pacchetti da Visualizza | altre finestre.

  2. Eseguire il comando indicato di seguito.

    PMC

    Install-Package Unity.Mvc3
    

    Installazione del pacchetto NuGet Unity.Mvc3 Installazione del pacchetto NuGet Unity.Mvc3

    Installazione del pacchetto NuGet unity.Mvc3

  3. Dopo aver installato il pacchetto Unity.Mvc3 , esplorare i file e le cartelle aggiunti automaticamente per semplificare la configurazione di Unity.

    Pacchetto Unity.Mvc3 installato nel

    Pacchetto Unity.Mvc3 installato

Attività 3 - Registrazione di Unity in Global.asax.cs Application_Start

In questa attività si aggiornerà il metodo Application_Start situato in Global.asax.cs per chiamare l'inizializzatore bootstrapper di Unity e quindi aggiornare il file bootstrapper che registra il servizio e il controller che si userà per l'inserimento delle dipendenze.

  1. A questo scopo, verrà collegato il bootstrapper che è il file che inizializza il contenitore Unity e Il sistema di risoluzione delle dipendenze. A tale scopo, aprire Global.asax.cs e aggiungere il codice evidenziato seguente all'interno del metodo Application_Start .

    (Frammento di codice - lab di inserimento delle dipendenze ASP.NET - Ex01 - Inizializza 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. Aprire il file Bootstrapper.cs .

  3. Includere gli spazi dei nomi seguenti: MvcMusicStore.Services e MusicStore.Controller.

    (Frammento di codice - lab di inserimento delle dipendenze ASP.NET - Ex01 - Bootstrapper Aggiunta di spazi dei nomi)

    using System.Web.Mvc;
    using Microsoft.Practices.Unity;
    using Unity.Mvc3;
    using MvcMusicStore.Services;
    using MvcMusicStore.Controllers;
    
  4. Sostituire il contenuto del metodo BuildUnityContainer con il codice seguente che registra controller di archiviazione e servizio di archiviazione.

    (Frammento di codice - lab di inserimento delle dipendenze ASP.NET - Ex01 - Registrare controller e servizio dell'archivio)

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

Attività 4 - Esecuzione dell'applicazione

In questa attività si eseguirà l'applicazione per verificare che sia ora possibile caricarla dopo aver incluso Unity.

  1. Premere F5 per eseguire l'applicazione, l'applicazione deve ora caricare senza visualizzare alcun messaggio di errore.

    Esecuzione dell'applicazione con inserimento di

    Esecuzione dell'applicazione con inserimento delle dipendenze

  2. Passare a /Store. Verrà richiamato StoreController, che ora viene creato usando Unity.

    MVC Music Store MVC Music Store

    MVC Music Store

  3. Chiudere il browser.

Negli esercizi seguenti si apprenderà come estendere l'ambito di inserimento delle dipendenze per usarlo all'interno di ASP.NET visualizzazioni MVC e filtri azione.

Esercizio 2: Inserimento di una visualizzazione

In questo esercizio si apprenderà come usare l'inserimento delle dipendenze in una visualizzazione con le nuove funzionalità di ASP.NET MVC 4 per l'integrazione di Unity. A tale scopo, si chiamerà un servizio personalizzato all'interno della visualizzazione Sfoglia dello Store, che mostrerà un messaggio e un'immagine sotto.

Si integra quindi il progetto con Unity e si creerà un resolver di dipendenza personalizzato per inserire le dipendenze.

Attività 1 - Creazione di una visualizzazione che usa un servizio

In questa attività verrà creata una visualizzazione che esegue una chiamata al servizio per generare una nuova dipendenza. Il servizio è costituito da un semplice servizio di messaggistica incluso in questa soluzione.

  1. Aprire la soluzione Begin disponibile nella cartella Source\Ex02-Injecting View\Begin . In caso contrario, è possibile continuare a usare la soluzione End ottenuta completando l'esercizio precedente.

    1. Se si apre la soluzione Begin fornita, è necessario scaricare alcuni pacchetti NuGet mancanti prima di continuare. A tale scopo, fare clic sul menu Progetto e selezionare Gestisci pacchetti NuGet.

    2. Nella finestra di dialogo Gestisci pacchetti NuGet fare clic su Ripristina per scaricare pacchetti mancanti.

    3. Compilare infine la soluzione facendo clic su Compila | soluzione.

      Nota

      Uno dei vantaggi dell'uso di NuGet è che non è necessario inviare tutte le librerie nel progetto, riducendo le dimensioni del progetto. Con NuGet Power Tools, specificando le versioni del pacchetto nel file Packages.config, sarà possibile scaricare tutte le librerie necessarie la prima volta che si esegue il progetto. Questo è il motivo per cui è necessario eseguire questi passaggi dopo aver aperto una soluzione esistente da questo lab.

      Per altre informazioni, vedere questo articolo: https://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages.

  2. Includere le classi MessageService.cs e IMessageService.cs presenti nella cartella Source \Assets in /Services. A tale scopo, fare clic con il pulsante destro del mouse sulla cartella Servizi e scegliere Aggiungi elemento esistente. Passare al percorso dei file e includerli.

    Aggiunta del servizio messaggi e dell'interfaccia

    Aggiunta del servizio messaggi e dell'interfaccia del servizio

    Nota

    L'interfaccia IMessageService definisce due proprietà implementate dalla classe MessageService . Queste proprietà -Message and ImageUrl- archiviano il messaggio e l'URL dell'immagine da visualizzare.

  3. Creare la cartella /Pages nella cartella radice del progetto e quindi aggiungere la classe esistente MyBasePage.cs da Source\Assets. La pagina di base che erediterà da ha la struttura seguente.

    Cartella 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. Aprire la visualizzazione Browse.cshtml dalla cartella /Views/Store e impostarla da MyBasePage.cs.

    @inherits MvcMusicStore.Pages.MyBasePage
    @{
         ViewBag.Title = "Browse Albums";
    }
    
  5. Nella visualizzazione Sfoglia aggiungere una chiamata a MessageService per visualizzare un'immagine e un messaggio recuperato dal servizio. (C#)

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

Attività 2 - Incluso un sistema di risoluzione delle dipendenze personalizzato e una pagina di visualizzazione personalizzata Attivatore

Nell'attività precedente è stata inserita una nuova dipendenza all'interno di una vista per eseguire una chiamata al servizio all'interno di essa. A questo scopo, la dipendenza verrà risolta implementando ASP.NET le interfacce di inserimento delle dipendenze MVC IViewPageActivator e IDependencyResolver. Nella soluzione verrà inclusa un'implementazione di IDependencyResolver che gestisce il recupero del servizio usando Unity. Verrà quindi inclusa un'altra implementazione personalizzata dell'interfaccia IViewPageActivator che risolverà la creazione delle visualizzazioni.

Nota

Poiché ASP.NET MVC 3, l'implementazione di Dependency Injection aveva semplificato le interfacce per registrare i servizi. IDependencyResolver e IViewPageActivator fanno parte delle funzionalità di ASP.NET MVC 3 per l'inserimento delle dipendenze.

- Interfaccia IDependencyResolver sostituisce l'interfaccia IMvcServiceLocator precedente. Gli implementatori di IDependencyResolver devono restituire un'istanza del servizio o una raccolta di servizi.

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

- Interfaccia IViewPageActivator offre un controllo più granulare sulla modalità di creazione di istanze delle pagine di visualizzazione tramite l'inserimento di dipendenze. Le classi che implementano l'interfaccia IViewPageActivator possono creare istanze di visualizzazione usando le informazioni sul contesto.

public interface IViewPageActivator {
    object Create(ControllerContext controllerContext, Type type);
}
  1. Creare la cartella /Factory nella cartella radice del progetto.

  2. Includere CustomViewPageActivator.cs nella soluzione da /Sources/Assets/ alla cartella Factory . A tale scopo, fare clic con il pulsante destro del mouse sulla cartella /Factory , selezionare Aggiungi | Elemento esistente e quindi selezionare CustomViewPageActivator.cs. Questa classe implementa l'interfaccia IViewPageActivator per contenere il contenitore 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);
            }
        }
    }
    

    Nota

    CustomViewPageActivator è responsabile della gestione della creazione di una visualizzazione usando un contenitore Unity.

  3. Includere il file UnityDependencyResolver.cs da /Sources/Assets alla cartella /Factory . A tale scopo, fare clic con il pulsante destro del mouse sulla cartella /Factory , selezionare Aggiungi | Elemento esistente e quindi selezionare File 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);
                    }
              }
         }
    }
    

    Nota

    La classe UnityDependencyResolver è una classe DependencyResolver personalizzata per Unity . Quando non è possibile trovare un servizio all'interno del contenitore Unity, il resolver di base viene invocato.

Nell'attività seguente entrambe le implementazioni verranno registrate per consentire al modello di conoscere la posizione dei servizi e le visualizzazioni.

Attività 3 - Registrazione per l'inserimento delle dipendenze all'interno del contenitore Unity

In questa attività si metteranno insieme tutti gli elementi precedenti per rendere funzionante l'inserimento delle dipendenze.

Fino a ora la soluzione include gli elementi seguenti:

  • Visualizzazione Sfoglia che eredita da MyBaseClass e usa MessageService.
  • Classe intermedia -MyBaseClass- con inserimento delle dipendenze dichiarata per l'interfaccia del servizio.
  • Servizio - MessageService - e l'interfaccia IMessageService.
  • Resolver di dipendenze personalizzato per Unity - UnityDependencyResolver , che gestisce il recupero del servizio.
  • Attivatore pagina di visualizzazione , CustomViewPageActivator , che crea la pagina.

Per inserire la visualizzazione Sfoglia , si registrerà ora il resolver di dipendenze personalizzato nel contenitore Unity.

  1. Aprire il file Bootstrapper.cs .

  2. Registrare un'istanza di MessageService nel contenitore Unity per inizializzare il servizio:

    (Frammento di codice - lab di inserimento delle dipendenze ASP.NET - Ex02 - Registrare il servizio messaggi)

    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. Aggiungere un riferimento allo spazio dei nomi MvcMusicStore.Factory .

    (Frammento di codice - lab di inserimento delle dipendenze ASP.NET - Ex02 - Spazio dei nomi factory)

    using System.Web.Mvc; 
    using Microsoft.Practices.Unity; 
    using Unity.Mvc3; 
    using MvcMusicStore.Services; 
    using MvcMusicStore.Controllers; 
    using MvcMusicStore.Factories;
    
  4. Registrare CustomViewPageActivator come attivatore della pagina di visualizzazione nel contenitore Unity:

    (Frammento di codice - ASP.NET lab di inserimento delle dipendenze - Ex02 - Registrare 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. Sostituire ASP.NET resolver di dipendenze predefinito MVC 4 con un'istanza di UnityDependencyResolver. A tale scopo, sostituire Il contenuto del metodo Initialize con il codice seguente:

    (Frammento di codice - lab di inserimento delle dipendenze ASP.NET - Ex02 - Aggiorna sistema di risoluzione delle dipendenze)

    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);
    }
    

    Nota

    ASP.NET MVC fornisce una classe resolver di dipendenze predefinita. Per usare i resolver di dipendenze personalizzati come quello creato per unity, questo sistema di risoluzione deve essere sostituito.

Attività 4 - Esecuzione dell'applicazione

In questa attività si eseguirà l'applicazione per verificare che il browser dello Store utilizza il servizio e visualizzi l'immagine e il messaggio recuperato:

  1. Premere F5 per eseguire l'applicazione.

  2. Fare clic su Rock all'interno del menu Generi e vedere come MessageService è stato inserito nella visualizzazione e caricato il messaggio di benvenuto e l'immagine. In questo esempio si immette "Rock":

    MVC Music Store - View Injection

    MVC Music Store - Inserimento visualizzazioni

  3. Chiudere il browser.

Esercizio 3: Inserimento di filtri azione

Nei filtri di personalizzazione e inserimento del lab precedente Hands-On lab sono stati usati filtri di personalizzazione e inserimento. In questo esercizio si apprenderà come inserire filtri con inserimento delle dipendenze usando il contenitore Unity. A tale scopo, si aggiungerà alla soluzione Music Store un filtro azione personalizzato che traccia l'attività del sito.

Attività 1- Inclusione del filtro di rilevamento nella soluzione

In questa attività si includerà in Music Store un filtro azione personalizzato per tracciare gli eventi. Poiché i concetti di filtro delle azioni personalizzati sono già trattati nel lab precedente "Filtri azione personalizzati", è sufficiente includere la classe di filtro dalla cartella Assets di questo lab e quindi creare un provider di filtri per Unity:

  1. Aprire la soluzione Begin disponibile nella cartella Source\Ex03 - Injecting Action Filter\Begin . In caso contrario, è possibile continuare a usare la soluzione End ottenuta completando l'esercizio precedente.

    1. Se è stata aperta la soluzione Begin fornita, è necessario scaricare alcuni pacchetti NuGet mancanti prima di continuare. A tale scopo, fare clic sul menu Progetto e selezionare Gestisci pacchetti NuGet.

    2. Nella finestra di dialogo Gestisci pacchetti NuGet fare clic su Ripristina per scaricare i pacchetti mancanti.

    3. Compilare infine la soluzione facendo clic su Compila | soluzione.

      Nota

      Uno dei vantaggi dell'uso di NuGet è che non è necessario spedire tutte le librerie nel progetto, riducendo le dimensioni del progetto. Con NuGet Power Tools, specificando le versioni del pacchetto nel file Packages.config, sarà possibile scaricare tutte le librerie necessarie la prima volta che si esegue il progetto. Questo è il motivo per cui sarà necessario eseguire questi passaggi dopo aver aperto una soluzione esistente da questo lab.

      Per altre informazioni, vedere questo articolo: https://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages.

  2. Includere il file TraceActionFilter.cs da /Sources/Assets alla cartella /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);
            }
        }
    }
    

    Nota

    Questo filtro azione personalizzato esegue ASP.NET traccia. Per altre informazioni di riferimento, è possibile controllare il lab "ASP.NET Filtri azione locale e dinamica di MVC 4".

  3. Aggiungere la classe vuota FilterProvider.cs al progetto nella cartella /Filters.

  4. Aggiungere gli spazi dei nomi System.Web.Mvc e Microsoft.Practices.Unity in FilterProvider.cs.

    (Frammento di codice - lab di inserimento delle dipendenze ASP.NET - Ex03 - Provider di filtri che aggiunge spazi dei nomi)

    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. Impostare la classe eredita dall'interfaccia IFilterProvider .

    namespace MvcMusicStore.Filters
    {
        public class FilterProvider : IFilterProvider
        {
        }
    }
    
  6. Aggiungere una proprietà IUnityContainer nella classe FilterProvider e quindi creare un costruttore di classe per assegnare il contenitore.

    (Frammento di codice - lab di inserimento delle dipendenze ASP.NET - Ex03 - Costruttore del provider di filtri)

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

    Nota

    Il costruttore della classe del provider di filtri non crea un nuovo oggetto all'interno di . Il contenitore viene passato come parametro e la dipendenza viene risolta da Unity.

  7. Nella classe FilterProvider implementare il metodo GetFilters dall'interfaccia IFilterProvider .

    (Frammento di codice - lab di inserimento delle dipendenze ASP.NET - Ex03 - GetFilter del provider di filtri)

    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);
            }
        }
    }
    

Attività 2 - Registrazione e abilitazione del filtro

In questa attività si abiliterà il rilevamento del sito. A tale scopo, si registrerà il filtro nel metodo Bootstrapper.cs BuildUnityContainer per avviare la traccia:

  1. Aprire Web.config nella radice del progetto e abilitare il rilevamento della traccia nel gruppo System.Web.

    <system.web>
        <trace enabled="true"/>
        <compilation debug="true" targetFramework="4.5">
    
  2. Aprire Bootstrapper.cs nella radice del progetto.

  3. Aggiungere un riferimento allo spazio dei nomi MvcMusicStore.Filters .

    (Frammento di codice - lab di inserimento delle dipendenze ASP.NET - Ex03 - Bootstrapper Aggiunta di spazi dei nomi)

    using System.Web.Mvc;
    using Microsoft.Practices.Unity;
    using Unity.Mvc3;
    using MvcMusicStore.Services;
    using MvcMusicStore.Controllers;
    using MvcMusicStore.Factories;
    using MvcMusicStore.Filters;
    
  4. Selezionare il metodo BuildUnityContainer e registrare il filtro nel contenitore Unity. Sarà necessario registrare il provider di filtri e il filtro delle azioni.

    (Frammento di codice - lab di inserimento delle dipendenze ASP.NET - Ex03 - Registrare FilterProvider e ActionFilter)

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

Attività 3 - Esecuzione dell'applicazione

In questa attività si eseguirà l'applicazione e si verificherà che il filtro azione personalizzato stia tracciando l'attività:

  1. Premere F5 per eseguire l'applicazione.

  2. Fare clic su Rock nel menu Generi. È possibile passare a più generi se si desidera.

    Music Store

    Music Store

  3. Passare a /Trace.axd per visualizzare la pagina Traccia applicazione e quindi fare clic su Visualizza dettagli.

    Log di traccia dell'applicazione

    Log di traccia delle applicazioni

    Traccia applicazione - Traccia applicazione dettagli richiesta

    Traccia dell'applicazione - Dettagli richiesta

  4. Chiudere il browser.


Riepilogo

Completando questo lab Hands-On si è appreso come usare l'inserimento delle dipendenze in ASP.NET MVC 4 integrando Unity con un pacchetto NuGet. A tale scopo, è stata usata l'inserimento delle dipendenze all'interno di controller, visualizzazioni e filtri azione.

Sono stati illustrati i concetti seguenti:

  • ASP.NET funzionalità di inserimento delle dipendenze MVC 4
  • Integrazione di Unity con il pacchetto NuGet Unity.Mvc3
  • Inserimento delle dipendenze nei controller
  • Inserimento delle dipendenze nelle viste
  • Inserimento delle dipendenze dei filtri azione

Appendice A: Installazione di Visual Studio Express 2012 per Il Web

È possibile installare Microsoft Visual Studio Express 2012 per Il Web o un'altra versione "Express" usando il Installazione guidata piattaforma Web Microsoft. Le istruzioni seguenti illustrano i passaggi necessari per installare Visual Studio Express 2012 per Il Web usando Installazione guidata piattaforma Web Microsoft.

  1. Passare a https://go.microsoft.com/?linkid=9810169. In alternativa, se è già stato installato Il programma di installazione della piattaforma Web, è possibile aprirlo e cercare il prodotto "Visual Studio Express 2012 per Il Web con Windows Azure SDK".

  2. Fare clic su Installa adesso. Se non si dispone di Installazione guidata piattaforma Web , si verrà reindirizzati per scaricarlo e installarlo per primo.

  3. Dopo aver aperto Il programma di installazione della piattaforma Web , fare clic su Installa per avviare l'installazione.

    Installare Visual Studio Express Installare Visual Studio Express

    Installare Visual Studio Express

  4. Leggere tutte le licenze e le condizioni dei prodotti e fare clic su Accetto per continuare.

    Accettazione delle condizioni di licenza

    Accettazione delle condizioni di licenza

  5. Attendere il completamento del processo di download e installazione.

    Stato dell'installazione

    Stato dell'installazione

  6. Al termine dell'installazione, fare clic su Fine.

    Installazione completata

    Installazione completata

  7. Fare clic su Esci per chiudere Il programma di installazione della piattaforma Web.

  8. Per aprire Visual Studio Express per Il Web, passare alla schermata Start e iniziare a scrivere "VS Express", quindi fare clic sul riquadro VS Express for Web.

    Riquadro di VS Express per Il Web

    Riquadro di VS Express per Il Web

Appendice B: Uso dei frammenti di codice

Con i frammenti di codice, tutto il codice necessario è a portata di mano. Il documento del lab indica esattamente quando è possibile usarli, come illustrato nella figura seguente.

Uso dei frammenti di codice di Visual Studio per inserire codice nel progetto

Uso dei frammenti di codice di Visual Studio per inserire codice nel progetto

Per aggiungere un frammento di codice usando la tastiera (solo C#)

  1. Posizionare il cursore in cui si vuole inserire il codice.
  2. Iniziare a digitare il nome del frammento (senza spazi o trattini).
  3. Osservare che IntelliSense visualizza i nomi dei frammenti di codice corrispondenti.
  4. Selezionare il frammento corretto o continuare a digitare finché non viene selezionato il nome dell'intero frammento.
  5. Premere tab due volte per inserire il frammento di codice nella posizione del cursore.

Iniziare a digitare il nome del frammento

Iniziare a digitare il nome del frammento di codice

Premere TAB per selezionare il frammento di codice evidenziato

Premere TAB per selezionare il frammento evidenziato

Premere di nuovo tabulazioni e il frammento di codice espanderà

Premere di nuovo TAB e il frammento verrà espanso

Per aggiungere un frammento di codice usando il mouse (C#, Visual Basic e XML) 1. Fare clic con il pulsante destro del mouse sul percorso in cui si vuole inserire il frammento di codice.

  1. Selezionare Inserisci frammento di codice seguito da Frammenti di codice personali.
  2. Selezionare il frammento di codice pertinente dall'elenco facendo clic su di esso.

Fare clic con il pulsante destro del mouse sul percorso in cui inserire il frammento di codice e scegliere Inserisci frammento di codice facendo

Fare clic con il pulsante destro del mouse su dove inserire il frammento di codice e selezionare Inserisci frammento

Selezionare il frammento di codice pertinente dall'elenco facendo clic su di

Selezionare il frammento di codice pertinente dall'elenco facendo clic su di esso