Condividi tramite


Inserimento di dipendenze di ASP.NET MVC 4

Per squadra di campi Web

Scarica Kit di formazione per i campi Web

Questo lab pratico presuppone la conoscenza di base dei filtri ASP.NET MVC e ASP.NET MVC 4. Se in precedenza non sono stati usati ASP.NET filtri MVC 4, è consigliabile passare a ASP.NET lab pratico dei filtri azione personalizzati MVC.

Nota

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

Nel paradigma di programmazione orientata a 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 complessità del modello

Dipendenze di classi e complessità del modello

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

Il modello di inserimento delle dipendenze è una particolare implementazione di Inversione del controllo. L'inversione del controllo (IoC) significa che gli oggetti non creano altri oggetti su cui si basano per svolgere il loro lavoro. Ottengono 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 del framework che passa i parametri del costruttore e imposta le proprietà.

Modello di progettazione di inserimento delle dipendenze

A livello generale, l'obiettivo dell'inserimento delle dipendenze è che una classe client (ad esempio , il golfista) necessita di qualcosa che soddisfi un'interfaccia (ad esempio IClub). Non importa cosa sia il tipo concreto (ad esempio WoodClub, IronClub, WedgeClub o PutterClub), vuole che qualcun altro gestisca quella (ad esempio una buona caddy). Il sistema di risoluzione delle dipendenze in ASP.NET MVC consente di registrare la logica di dipendenza in un'altra posizione ,ad esempio un contenitore o un contenitore di club.

Diagramma di inserimento delle dipendenze

Inserimento delle dipendenze - Analogia tra golf

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

  • Riduce l'accoppiamento di classi
  • Aumenta il riutilizzo del codice
  • Migliora la gestibilità del codice
  • Migliora i test delle applicazioni

Nota

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

Dopo aver compreso 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. Successivamente, si applicherà l'inserimento delle dipendenze alle visualizzazioni per utilizzare un servizio e visualizzare le informazioni. Infine, si estenderà l'inserimento dell'inserimento dell'inserimento di dipendenze in ASP.NET filtri MVC 4 nella soluzione.

In questo lab pratico si apprenderà come:

  • Integrare ASP.NET MVC 4 con Unity per l'inserimento delle dipendenze usando pacchetti NuGet
  • Usare l'inserimento delle dipendenze all'interno di un controller MVC ASP.NET
  • Usare l'inserimento delle dipendenze all'interno di una vista 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 funzionare con ASP.NET MVC 4.

Prerequisiti

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

Attrezzaggio

Installazione di frammenti di codice

Per praticità, gran parte del codice che si gestirà con 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 di frammenti di codice".


Esercizi

Questo lab pratico è 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 altre informazioni sull'utilizzo degli esercizi.

Tempo stimato per il completamento del 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 con un pacchetto NuGet. Per questo motivo, verranno inclusi i servizi 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 utilizza StoreService.

Di seguito è possibile notare 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 . Tuttavia, StoreController 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 dello Store che separa l'accesso ai dati dalla logica dell'applicazione.

Quando si esegue l'applicazione, si riceverà un'eccezione, perché 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 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 è 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 MVC Begin Application

    Errore durante l'esecuzione ASP.NET MVC Begin Application

  3. Chiudere il browser.

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

Attività 2 - Inclusione di 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 delle dipendenze leggero ed estendibile con supporto facoltativo per l'intercettazione di tipo e istanza. Si tratta di un contenitore per utilizzo generico 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. Esegui il comando seguente:

    PMC

    Install-Package 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

    Pacchetto Unity.Mvc3 installato

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

In questa attività si aggiornerà il metodo Application_Start che si trova in Global.asax.cs per chiamare l'inizializzatore del programma di avvio automatico di Unity e quindi aggiornare il file del programma di avvio automatico che registra il servizio e il controller da usare per l'inserimento delle dipendenze.

  1. A questo scopo, si associa il programma di avvio automatico, ovvero 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 - Inizializzare 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 Bootstrapper.cs file.

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

    (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 il controller di archiviazione e il 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 verrà ora caricata senza visualizzare alcun messaggio di errore.

    Esecuzione dell'applicazione con inserimento delle dipendenze

    Esecuzione dell'applicazione con inserimento delle dipendenze

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

    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, chiamerai un servizio personalizzato all'interno della visualizzazione Sfoglia dello Store, che mostrerà un messaggio e un'immagine di seguito.

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

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

In questa attività verrà creata una vista 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 che si trova nella cartella Source\Ex02-Injecting View\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 è 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 MessageService.cs e le classi IMessageService.cs che si trovano 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 del servizio

    Aggiunta del servizio messaggi e dell'interfaccia del servizio

    Nota

    L'interfaccia IMessageService definisce due proprietà implementate dalla classe MessageService . Queste proprietà -Message e ImageUrl- archivia 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 da cui si erediterà 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 vista Browse.cshtml dalla cartella /Views/Store e impostarla come eredita 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 - Inclusione di un resolver di dipendenze personalizzato e di un attivatore di pagina di visualizzazione personalizzata

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

Nota

Da 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.

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

- L'interfaccia IViewPageActivator offre un controllo più granulare sulla modalità di creazione di istanze delle pagine di visualizzazione tramite l'inserimento delle 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 alla soluzione dalla cartella /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 tramite un contenitore Unity.

  3. Includere UnityDependencyResolver.cs file 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 UnityDependencyResolver.cs file.

    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 evocato.

Nell'attività seguente entrambe le implementazioni verranno registrate per informare il modello della posizione dei servizi e delle visualizzazioni.

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

In questa attività verranno messi insieme tutti gli elementi precedenti per eseguire l'inserimento delle dipendenze.

Fino a questo momento la soluzione include gli elementi seguenti:

  • Visualizzazione Sfoglia che eredita da MyBaseClass e utilizza MessageService.
  • Classe intermedia -MyBaseClass- con inserimento delle dipendenze dichiarato per l'interfaccia del servizio.
  • Un servizio - MessageService - e la relativa interfaccia IMessageService.
  • Un sistema di risoluzione delle 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 , ora si registrerà il sistema di risoluzione delle dipendenze personalizzato nel contenitore Unity.

  1. Aprire Bootstrapper.cs file.

  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 - lab di inserimento delle dipendenze ASP.NET - Ex02 - Register 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 sistema di risoluzione delle dipendenze predefinito MVC 4 con un'istanza di UnityDependencyResolver. A tale scopo, sostituire Initialize method content with the following code :To do this, replace Initialize method content with the following code:

    (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 dipendenza 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 nel 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 - Visualizza inserimento

    MVC Music Store - Visualizza inserimento

  3. Chiudere il browser.

Esercizio 3: Inserimento di filtri azione

Nei precedenti filtri di azione personalizzati del lab pratico sono stati usati i 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 che si trova nella cartella Source\Ex03 - Injecting Action Filter\Begin.Open the Begin solution located in the Source\Ex03 - Injecting Action Filter\Begin folder. 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 è 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 TraceActionFilter.cs file 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, vedere il lab "ASP.NET MVC 4 local and Dynamic Action Filters" (Filtri azione dinamica e locale 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. 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 in Bootstrapper.cs metodo 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 - Registra 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 dell'applicazione

    Traccia dell'applicazione - Dettagli richiesta

    Traccia dell'applicazione - Dettagli richiesta

  4. Chiudere il browser.


Riepilogo

Completando questo lab pratico 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 trattati 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 visualizzazioni
  • Inserimento delle dipendenze dei filtri azione

Appendice A: Installazione di Visual Studio Express 2012 per 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 /iis/extensions/introduction-to-iis-express/iis-express-overview?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 for Web con Windows Azure SDK".

  2. Fare clic su Installa ora. Se non si dispone del programma di installazione della 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

  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 installazione

    Stato dell'installazione

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

    Installazione completata

    Installazione completata

  7. Fare clic su Esci per chiudere Programma di installazione piattaforma Web.

  8. Per aprire Visual Studio Express for 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 di frammenti di codice

Con i frammenti di codice è disponibile 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 desidera inserire il codice.
  2. Iniziare a digitare il nome del frammento (senza spazi o trattini).
  3. Guardare come IntelliSense visualizza i nomi dei frammenti di codice corrispondenti.
  4. Selezionare il frammento corretto (o continuare a digitare fino a quando non viene selezionato il nome dell'intero frammento).
  5. Premere il tasto 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

Premere TAB per selezionare il frammento di codice evidenziato

Premere TAB per selezionare il frammento di codice evidenziato

Premere di nuovo TAB e il frammento di codice verrà espanso

Premere di nuovo TAB e il frammento di codice 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 su dove 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 su dove inserire il frammento di codice e selezionare Inserisci frammento

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 esso

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