Udostępnij za pośrednictwem


ASP.NET MVC 4 — wstrzykiwanie zależności

Autor: Web Camps Team

Pobierz zestaw szkoleniowy obozów internetowych

W tym praktycznym laboratorium założono, że masz podstawową wiedzę na temat ASP.NET MVC i ASP.NET filtrów MVC 4. Jeśli wcześniej nie użyto filtrów ASP.NET MVC 4, zalecamy przejście przez ASP.NET laboratorium filtrów niestandardowych akcji MVC.

Uwaga

Cały przykładowy kod i fragmenty kodu znajdują się w zestawie szkoleniowym web camps dostępnym w witrynie Microsoft-Web/WebCampTrainingKit Releases. Projekt specyficzny dla tego laboratorium jest dostępny w ASP.NET wstrzykiwanie zależności MVC 4.

W modelu programowania obiektowego obiekty współpracują ze sobą w modelu współpracy, w którym znajdują się współautorzy i konsumenci. Oczywiście ten model komunikacji generuje zależności między obiektami i składnikami, co staje się trudne do zarządzania, gdy zwiększa się złożoność.

Zależności klas i złożoność modelu

Zależności klas i złożoność modelu

Prawdopodobnie znasz wzorzec fabryki i separację między interfejsem a implementacją przy użyciu usług, gdzie obiekty klienta są często odpowiedzialne za lokalizację usługi.

Wzorzec wstrzykiwania zależności jest konkretną implementacją inwersji kontrolki. Inversion of Control (IoC) oznacza, że obiekty nie tworzą innych obiektów, na których polegają, aby wykonywać swoją pracę. Zamiast tego pobierają obiekty potrzebne z zewnętrznego źródła (na przykład plik konfiguracji XML).

Wstrzykiwanie zależności (DI) oznacza, że odbywa się to bez interwencji obiektu, zwykle przez składnik struktury, który przekazuje parametry konstruktora i ustawia właściwości.

Wzorzec projektu wstrzykiwania zależności (DI)

Na wysokim poziomie celem wstrzykiwania zależności jest to, że klasa klienta (np. golfista) potrzebuje czegoś, co spełnia interfejs (np. IClub). Nie obchodzi to, jaki jest typ betonu (np. WoodClub, IronClub, WedgeClub lub PutterClub), chce, aby ktoś inny poradził sobie z tym (np. dobry caddy). Narzędzie rozpoznawania zależności w ASP.NET MVC umożliwia rejestrowanie logiki zależności w innym miejscu (np. kontenera lub torby klubów).

Diagram wstrzykiwania zależności

Wstrzykiwanie zależności — analogia golfowa

Zalety korzystania ze wzorca wstrzykiwania zależności i inwersji kontrolki są następujące:

  • Zmniejsza sprzężenie klas
  • Zwiększa ponowne tworzenie kodu
  • Poprawia łatwość konserwacji kodu
  • Poprawia testowanie aplikacji

Uwaga

Wstrzykiwanie zależności jest czasami porównywane ze wzorcem projektowania abstrakcyjnej fabryki, ale istnieje niewielka różnica między obydwoma podejściami. Di ma strukturę działającą w celu rozwiązywania zależności przez wywołanie fabryk i zarejestrowanych usług.

Teraz, gdy znasz wzorzec wstrzykiwania zależności, dowiesz się w tym laboratorium, jak zastosować go w ASP.NET MVC 4. Zaczniesz używać wstrzykiwania zależności w kontrolerach, aby uwzględnić usługę dostępu do bazy danych. Następnie zastosujesz iniekcję zależności do widoków, aby korzystać z usługi i wyświetlić informacje. Na koniec rozszerzysz di do ASP.NET filtrów MVC 4, wstrzykiwając niestandardowy filtr akcji w rozwiązaniu.

W tym praktycznym laboratorium dowiesz się, jak wykonywać następujące działania:

  • Integrowanie ASP.NET MVC 4 z aparatem Unity na potrzeby wstrzykiwania zależności przy użyciu pakietów NuGet
  • Używanie wstrzykiwania zależności wewnątrz kontrolera MVC ASP.NET
  • Używanie wstrzykiwania zależności wewnątrz widoku MVC ASP.NET
  • Używanie wstrzykiwania zależności wewnątrz filtru akcji MVC ASP.NET

Uwaga

To laboratorium używa pakietu NuGet Unity.Mvc3 do rozwiązywania zależności, ale istnieje możliwość dostosowania dowolnej struktury wstrzykiwania zależności do pracy z ASP.NET MVC 4.

Wymagania wstępne

Aby ukończyć to laboratorium, musisz mieć następujące elementy:

Ustawienia

Instalowanie fragmentów kodu

Dla wygody większość kodu, którym będziesz zarządzać w tym laboratorium, jest dostępna jako fragmenty kodu programu Visual Studio. Aby zainstalować fragmenty kodu, uruchom plik .\Source\Setup\CodeSnippets.vsi .

Jeśli nie znasz fragmentów kodu programu Visual Studio Code i chcesz dowiedzieć się, jak z nich korzystać, możesz zapoznać się z dodatkiem z tego dokumentu "Dodatek B: Używanie fragmentów kodu".


Ćwiczenia

To praktyczne laboratorium składa się z następujących ćwiczeń:

  1. Ćwiczenie 1. Wstrzykiwanie kontrolera
  2. Ćwiczenie 2. Wstrzykiwanie widoku
  3. Ćwiczenie 3. Wstrzykiwanie filtrów

Uwaga

Każde ćwiczenie jest dołączone do folderu End zawierającego wynikowe rozwiązanie, które należy uzyskać po zakończeniu ćwiczeń. Możesz użyć tego rozwiązania jako przewodnika, jeśli potrzebujesz dodatkowej pomocy podczas wykonywania ćwiczeń.

Szacowany czas ukończenia tego laboratorium: 30 minut.

Ćwiczenie 1. Wstrzykiwanie kontrolera

W tym ćwiczeniu dowiesz się, jak używać wstrzykiwania zależności w kontrolerach MVC ASP.NET, integrując aparat Unity z pakietem NuGet. Z tego powodu dołączysz usługi do kontrolerów MvcMusicStore, aby oddzielić logikę od dostępu do danych. Usługi spowodują utworzenie nowej zależności w konstruktorze kontrolera, który zostanie rozwiązany przy użyciu wstrzykiwania zależności za pomocą aparatu Unity.

W tym podejściu pokazano, jak wygenerować mniej sprzężone aplikacje, które są bardziej elastyczne i łatwiejsze do utrzymania i testowania. Dowiesz się również, jak zintegrować ASP.NET MVC z aparatem Unity.

Informacje o usłudze StoreManager

Sklep MVC Music Store udostępniony w rozwiązaniu początkowym zawiera teraz usługę, która zarządza danymi kontrolera magazynu o nazwie StoreService. Poniżej znajdziesz implementację usługi Store. Należy pamiętać, że wszystkie metody zwracają jednostki modelu.

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 od początku rozwiązania korzysta teraz z usługi StoreService. Wszystkie odwołania do danych zostały usunięte ze sklepu StoreController, a teraz możliwe jest zmodyfikowanie bieżącego dostawcy dostępu do danych bez zmiany jakiejkolwiek metody, która korzysta z usługi StoreService.

Poniżej znajdziesz, że implementacja StoreController ma zależność z StoreService wewnątrz konstruktora klasy.

Uwaga

Zależność wprowadzona w tym ćwiczeniu jest związana z inwersją kontroli (IoC).

Konstruktor klasy StoreController odbiera parametr typu IStoreService, który jest niezbędny do wykonywania wywołań usługi z wewnątrz klasy. Jednak StoreController nie implementuje domyślnego konstruktora (bez parametrów), który każdy kontroler musi pracować z ASP.NET MVC.

Aby rozwiązać zależność, kontroler musi zostać utworzony przez fabrykę abstrakcyjną (klasę zwracającą dowolny obiekt określonego typu).

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

Uwaga

Podczas próby utworzenia klasy StoreController bez wysyłania obiektu usługi wystąpi błąd, ponieważ nie zadeklarowany jest konstruktor bez parametrów.

Zadanie 1 — uruchamianie aplikacji

W tym zadaniu uruchomisz aplikację Begin, która zawiera usługę do kontrolera magazynu, który oddziela dostęp do danych od logiki aplikacji.

Podczas uruchamiania aplikacji otrzymasz wyjątek, ponieważ usługa kontrolera nie jest domyślnie przekazywana jako parametr:

  1. Otwórz rozwiązanie Begin znajdujące się w folderze Source\Ex01-Injecting Controller\Begin.

    1. Zanim przejdziesz dalej, musisz pobrać brakujące pakiety NuGet. W tym celu kliknij menu Projekt i wybierz pozycję Zarządzaj pakietami NuGet.

    2. W oknie dialogowym Zarządzanie pakietami NuGet kliknij pozycję Przywróć, aby pobrać brakujące pakiety.

    3. Na koniec skompiluj rozwiązanie, klikając pozycję Kompiluj rozwiązanie kompilacji | .

      Uwaga

      Jedną z zalet korzystania z narzędzia NuGet jest to, że nie trzeba dostarczać wszystkich bibliotek w projekcie, zmniejszając rozmiar projektu. Za pomocą narzędzi NuGet Power Tools, określając wersje pakietów w pliku Packages.config, będzie można pobrać wszystkie wymagane biblioteki przy pierwszym uruchomieniu projektu. Dlatego po otwarciu istniejącego rozwiązania z tego laboratorium trzeba będzie uruchomić te kroki.

  2. Naciśnij Ctrl + F5 , aby uruchomić aplikację bez debugowania. Zostanie wyświetlony komunikat o błędzie "Nie zdefiniowano konstruktora bez parametrów dla tego obiektu":

    Błąd podczas uruchamiania aplikacji ASP.NET MVC Begin

    Błąd podczas uruchamiania aplikacji ASP.NET MVC Begin

  3. Zamknij okno przeglądarki.

W poniższych krokach będziesz pracować nad rozwiązaniem magazynu muzyki, aby wstrzyknąć zależność, której potrzebuje ten kontroler.

Zadanie 2 — dołączanie aparatu Unity do rozwiązania MvcMusicStore

W tym zadaniu dołączysz do rozwiązania pakiet NuGet Unity.Mvc3 .

Uwaga

Pakiet Unity.Mvc3 został zaprojektowany pod kątem ASP.NET MVC 3, ale jest w pełni zgodny z ASP.NET MVC 4.

Unity to lekki, rozszerzalny kontener iniekcji zależności z opcjonalną obsługą przechwytywania wystąpień i typów. Jest to kontener ogólnego przeznaczenia do użycia w dowolnym typie aplikacji .NET. Udostępnia on wszystkie typowe funkcje występujące w mechanizmach wstrzykiwania zależności, w tym: tworzenie obiektów, abstrakcję wymagań przez określenie zależności w czasie wykonywania i elastyczności, odroczenie konfiguracji składnika do kontenera.

  1. Zainstaluj pakiet NuGet Unity.Mvc3 w projekcie MvcMusicStore . W tym celu otwórz konsolę Menedżer pakietów w obszarze Wyświetl | inne okna.

  2. Uruchom następujące polecenie.

    PMC

    Install-Package Unity.Mvc3
    

    Instalowanie pakietu NuGet Unity.Mvc3

    Instalowanie pakietu NuGet Unity.Mvc3

  3. Po zainstalowaniu pakietu Unity.Mvc3 zapoznaj się z plikami i folderami, które automatycznie dodaje, aby uprościć konfigurację aparatu Unity.

    Zainstalowany pakiet Unity.Mvc3

    Zainstalowany pakiet Unity.Mvc3

Zadanie 3 . Rejestrowanie aparatu Unity w Global.asax.cs Application_Start

W tym zadaniu zaktualizujesz metodę Application_Start znajdującą się w Global.asax.cs w celu wywołania inicjatora programu Bootstrapper aparatu Unity, a następnie zaktualizujesz plik programu inicjujący rejestrujący usługę i kontroler, którego użyjesz do wstrzykiwania zależności.

  1. Teraz podłączysz program inicjujący, który jest plikiem, który inicjuje kontener Unity i narzędzie Do rozpoznawania zależności. W tym celu otwórz Global.asax.cs i dodaj następujący wyróżniony kod w metodzie Application_Start .

    (Fragment kodu — ASP.NET Laboratorium iniekcji zależności — Ex01 — Inicjowanie aparatu 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. Otwórz plik Bootstrapper.cs .

  3. Uwzględnij następujące przestrzenie nazw: MvcMusicStore.Services i MusicStore.Controllers.

    (Fragment kodu — ASP.NET laboratorium iniekcji zależności — Ex01 — Bootstrapper dodawanie przestrzeni nazw)

    using System.Web.Mvc;
    using Microsoft.Practices.Unity;
    using Unity.Mvc3;
    using MvcMusicStore.Services;
    using MvcMusicStore.Controllers;
    
  4. Zastąp zawartość metody BuildUnityContainer następującym kodem, który rejestruje kontroler magazynu i usługę magazynu.

    (Fragment kodu — ASP.NET laboratorium iniekcji zależności — Ex01 — Rejestrowanie kontrolera magazynu i usługi)

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

Zadanie 4 . Uruchamianie aplikacji

W tym zadaniu uruchomisz aplikację, aby sprawdzić, czy można ją teraz załadować po włączeniu aparatu Unity.

  1. Naciśnij F5 , aby uruchomić aplikację, aplikacja powinna teraz zostać załadowana bez wyświetlania żadnego komunikatu o błędzie.

    Uruchamianie aplikacji z wstrzyknięciem zależności

    Uruchamianie aplikacji z wstrzyknięciem zależności

  2. Przejdź do /Store. Spowoduje to wywołanie metody StoreController, która jest teraz tworzona przy użyciu aparatu Unity.

    MVC Music Store

    MVC Music Store

  3. Zamknij okno przeglądarki.

W poniższych ćwiczeniach dowiesz się, jak rozszerzyć zakres wstrzykiwania zależności, aby używać go wewnątrz ASP.NET widoków MVC i filtrów akcji.

Ćwiczenie 2. Wstrzykiwanie widoku

W tym ćwiczeniu dowiesz się, jak używać wstrzykiwania zależności w widoku z nowymi funkcjami ASP.NET MVC 4 na potrzeby integracji aparatu Unity. Aby to zrobić, wywołasz usługę niestandardową w widoku przeglądania sklepu, która będzie wyświetlać komunikat i obraz poniżej.

Następnie zintegrujesz projekt z aparatem Unity i utworzysz niestandardowy moduł rozpoznawania zależności, aby wstrzyknąć zależności.

Zadanie 1 . Tworzenie widoku wykorzystującego usługę

W tym zadaniu utworzysz widok, który wykonuje wywołanie usługi w celu wygenerowania nowej zależności. Usługa składa się z prostej usługi obsługi komunikatów zawartej w tym rozwiązaniu.

  1. Otwórz rozwiązanie Rozpocznij znajdujące się w folderze Source\Ex02-Injecting View\Begin. W przeciwnym razie możesz kontynuować korzystanie z rozwiązania końcowego uzyskanego przez ukończenie poprzedniego ćwiczenia.

    1. Jeśli otwarto podane rozwiązanie Begin , przed kontynuowanie musisz pobrać brakujące pakiety NuGet. W tym celu kliknij menu Projekt i wybierz pozycję Zarządzaj pakietami NuGet.

    2. W oknie dialogowym Zarządzanie pakietami NuGet kliknij pozycję Przywróć, aby pobrać brakujące pakiety.

    3. Na koniec skompiluj rozwiązanie, klikając pozycję Kompiluj rozwiązanie kompilacji | .

      Uwaga

      Jedną z zalet korzystania z narzędzia NuGet jest to, że nie trzeba dostarczać wszystkich bibliotek w projekcie, zmniejszając rozmiar projektu. Za pomocą narzędzi NuGet Power Tools, określając wersje pakietów w pliku Packages.config, będzie można pobrać wszystkie wymagane biblioteki przy pierwszym uruchomieniu projektu. Dlatego po otwarciu istniejącego rozwiązania z tego laboratorium trzeba będzie uruchomić te kroki.

      Aby uzyskać więcej informacji, zobacz ten artykuł: https://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages.

  2. Uwzględnij MessageService.cs i klasy IMessageService.cs znajdujące się w folderze Source \Assets w /Services. W tym celu kliknij prawym przyciskiem myszy folder Usługi i wybierz polecenie Dodaj istniejący element. Przejdź do lokalizacji plików i dołącz je.

    Dodawanie usługi Message Service i interfejsu usługi

    Dodawanie usługi Message Service i interfejsu usługi

    Uwaga

    Interfejs IMessageService definiuje dwie właściwości zaimplementowane przez klasę MessageService . Te właściwości — Message i ImageUrl — przechowują komunikat i adres URL obrazu do wyświetlenia.

  3. Utwórz folder /Pages w folderze głównym projektu, a następnie dodaj istniejącą klasę MyBasePage.cs z lokalizacji Source\Assets. Strona podstawowa, z której będziesz dziedziczyć, ma następującą strukturę.

    Folder 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. Otwórz widok Browse.cshtml z folderu /Views/Store i ustaw go na dziedziczenie po MyBasePage.cs.

    @inherits MvcMusicStore.Pages.MyBasePage
    @{
         ViewBag.Title = "Browse Albums";
    }
    
  5. W widoku Przeglądania dodaj wywołanie usługi MessageService, aby wyświetlić obraz i komunikat pobrany przez usługę. (C#)

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

Zadanie 2 — dołączanie niestandardowego modułu rozpoznawania zależności i aktywatora strony widoku niestandardowego

W poprzednim zadaniu wstrzyknął nową zależność w widoku, aby wykonać wewnątrz niego wywołanie usługi. Teraz rozwiążesz ten problem, implementując interfejsy iniekcji zależności ASP.NET MVC IViewPageActivator i IDependencyResolver. W rozwiązaniu zostanie uwzględniona implementacja rozwiązania IDependencyResolver , która zajmie się pobieraniem usługi przy użyciu aparatu Unity. Następnie dołączysz kolejną niestandardową implementację interfejsu IViewPageActivator , który rozwiąże problemy z tworzeniem widoków.

Uwaga

Ponieważ ASP.NET MVC 3, implementacja wstrzykiwania zależności uprościła interfejsy do rejestrowania usług. Funkcje IDependencyResolver i IViewPageActivator są częścią funkcji ASP.NET MVC 3 na potrzeby wstrzykiwania zależności.

— Interfejs IDependencyResolver zastępuje poprzedni element IMvcServiceLocator. Implementatory IDependencyResolver muszą zwrócić wystąpienie usługi lub kolekcji usług.

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

— Interfejs IViewPageActivator zapewnia bardziej szczegółową kontrolę nad sposobem tworzenia wystąpionych stron widoku za pomocą wstrzykiwania zależności. Klasy implementujące interfejs IViewPageActivator mogą tworzyć wystąpienia widoku przy użyciu informacji kontekstowych.

public interface IViewPageActivator {
    object Create(ControllerContext controllerContext, Type type);
}
  1. Utwórz folder /Factory w folderze głównym projektu.

  2. Dołącz CustomViewPageActivator.cs do rozwiązania z folderu /Sources/Assets/ do folderu Factory . Aby to zrobić, kliknij prawym przyciskiem myszy folder /Factory , wybierz pozycję Dodaj | Istniejący element , a następnie wybierz pozycję CustomViewPageActivator.cs. Ta klasa implementuje interfejs IViewPageActivator do przechowywania kontenera aparatu 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);
            }
        }
    }
    

    Uwaga

    CustomViewPageActivator jest odpowiedzialny za zarządzanie tworzeniem widoku przy użyciu kontenera aparatu Unity.

  3. Dołącz plik UnityDependencyResolver.cs z folderu /Sources/Assets do folderu /Factory . Aby to zrobić, kliknij prawym przyciskiem myszy folder /Factory , wybierz pozycję Dodaj | Istniejący element , a następnie wybierz pozycję UnityDependencyResolver.cs plik.

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

    Uwaga

    UnityDependencyResolver, klasa to niestandardowy element DependencyResolver dla aparatu Unity. Jeśli nie można odnaleźć usługi wewnątrz kontenera aparatu Unity, podstawowy program rozpoznawania nazw jest wywoływany.

W poniższym zadaniu obie implementacje zostaną zarejestrowane, aby poinformować model o lokalizacji usług i widoków.

Zadanie 3 . Rejestrowanie pod kątem wstrzykiwania zależności w kontenerze aparatu Unity

W tym zadaniu połączysz wszystkie poprzednie elementy, aby wykonać zadanie wstrzykiwania zależności.

Do tej pory rozwiązanie ma następujące elementy:

  • Widok przeglądania dziedziczony z klasy MyBaseClass i korzystający z usługi MessageService.
  • Klasa pośrednia -MyBaseClass, która ma wstrzykiwanie zależności zadeklarowane dla interfejsu usługi.
  • Usługa — MessageService — i jej interfejs IMessageService.
  • Niestandardowy moduł rozpoznawania zależności dla aparatu Unity — UnityDependencyResolver — który zajmuje się pobieraniem usługi.
  • Aktywator strony widoku — CustomViewPageActivator — który tworzy stronę.

Aby wstrzyknąć widok przeglądania , teraz zarejestrujesz niestandardowy moduł rozpoznawania zależności w kontenerze aparatu Unity.

  1. Otwórz plik Bootstrapper.cs .

  2. Zarejestruj wystąpienie usługi MessageService w kontenerze aparatu Unity, aby zainicjować usługę:

    (Fragment kodu — ASP.NET Laboratorium iniekcji zależności — Ex02 — Rejestrowanie usługi komunikatów)

    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. Dodaj odwołanie do przestrzeni nazw MvcMusicStore.Factory .

    (Fragment kodu — ASP.NET laboratorium iniekcji zależności — Ex02 — przestrzeń nazw fabryk)

    using System.Web.Mvc; 
    using Microsoft.Practices.Unity; 
    using Unity.Mvc3; 
    using MvcMusicStore.Services; 
    using MvcMusicStore.Controllers; 
    using MvcMusicStore.Factories;
    
  4. Zarejestruj element CustomViewPageActivator jako aktywator strony widoku w kontenerze aparatu Unity:

    (Fragment kodu — ASP.NET Laboratorium iniekcji zależności — Ex02 — Rejestrowanie elementu 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. Zastąp domyślnym modułem rozpoznawania zależności ASP.NET MVC 4 wystąpieniem aparatu UnityDependencyResolver. W tym celu zastąp ciąg Initialize zawartości metody następującym kodem:

    (Fragment kodu — ASP.NET laboratorium iniekcji zależności — 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);
    }
    

    Uwaga

    ASP.NET MVC udostępnia domyślną klasę rozpoznawania zależności. Aby pracować z niestandardowymi modułami rozpoznawania zależności, które utworzyliśmy dla aparatu Unity, należy zamienić ten moduł rozpoznawania.

Zadanie 4 . Uruchamianie aplikacji

W tym zadaniu uruchomisz aplikację, aby sprawdzić, czy przeglądarka sklepu korzysta z usługi i wyświetla obraz oraz pobrany komunikat:

  1. Naciśnij klawisz F5, aby uruchomić aplikację.

  2. Kliknij pozycję Rock w menu Gatunek i zobacz, jak usługa MessageService została wstrzyknięta do widoku i załadowana wiadomość powitalna oraz obraz. W tym przykładzie wprowadzamy ciąg "Rock":

    Sklep MVC Music Store — wstrzykiwanie widoku

    Sklep MVC Music Store — wstrzykiwanie widoku

  3. Zamknij okno przeglądarki.

Ćwiczenie 3. Wprowadzanie filtrów akcji

W poprzednich praktycznych laboratorium niestandardowe filtry akcji pracowały z dostosowywaniem filtrów i iniekcją. W tym ćwiczeniu dowiesz się, jak wstrzykiwać filtry za pomocą wstrzykiwania zależności przy użyciu kontenera aparatu Unity. W tym celu dodasz do rozwiązania Music Store niestandardowy filtr akcji, który będzie śledzić aktywność witryny.

Zadanie 1 — dołączanie filtru śledzenia w rozwiązaniu

W tym zadaniu uwzględnisz w Sklepie Muzycznym niestandardowy filtr akcji w celu śledzenia zdarzeń. Ponieważ koncepcje filtru akcji niestandardowych są już traktowane w poprzednim laboratorium "Niestandardowe filtry akcji", wystarczy dołączyć klasę filtru z folderu Assets tego laboratorium, a następnie utworzyć dostawcę filtru dla aparatu Unity:

  1. Otwórz rozwiązanie Begin znajdujące się w folderze Source\Ex03 - Injecting Action Filter\Begin. W przeciwnym razie możesz kontynuować korzystanie z rozwiązania końcowego uzyskanego przez ukończenie poprzedniego ćwiczenia.

    1. Jeśli otwarto podane rozwiązanie Begin , przed kontynuowanie musisz pobrać brakujące pakiety NuGet. W tym celu kliknij menu Projekt i wybierz pozycję Zarządzaj pakietami NuGet.

    2. W oknie dialogowym Zarządzanie pakietami NuGet kliknij pozycję Przywróć, aby pobrać brakujące pakiety.

    3. Na koniec skompiluj rozwiązanie, klikając pozycję Kompiluj rozwiązanie kompilacji | .

      Uwaga

      Jedną z zalet korzystania z narzędzia NuGet jest to, że nie trzeba dostarczać wszystkich bibliotek w projekcie, zmniejszając rozmiar projektu. Za pomocą narzędzi NuGet Power Tools, określając wersje pakietów w pliku Packages.config, będzie można pobrać wszystkie wymagane biblioteki przy pierwszym uruchomieniu projektu. Dlatego po otwarciu istniejącego rozwiązania z tego laboratorium trzeba będzie uruchomić te kroki.

      Aby uzyskać więcej informacji, zobacz ten artykuł: https://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages.

  2. Dołącz plik TraceActionFilter.cs z folderu /Sources/Assets do folderu /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);
            }
        }
    }
    

    Uwaga

    Ten filtr akcji niestandardowej wykonuje śledzenie ASP.NET. Aby uzyskać więcej informacji, możesz sprawdzić laboratorium "ASP.NET MVC 4 lokalnych i dynamicznych filtrów akcji".

  3. Dodaj pustą klasę FilterProvider.cs do projektu w folderze /Filters.

  4. Dodaj przestrzenie nazw System.Web.Mvc i Microsoft.Practices.Unity w FilterProvider.cs.

    (Fragment kodu — ASP.NET laboratorium iniekcji zależności — Ex03 — dostawca filtru dodający przestrzenie nazw)

    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. Ustaw klasę na dziedziczenie po interfejsie IFilterProvider .

    namespace MvcMusicStore.Filters
    {
        public class FilterProvider : IFilterProvider
        {
        }
    }
    
  6. Dodaj właściwość IUnityContainer w klasie FilterProvider, a następnie utwórz konstruktor klasy w celu przypisania kontenera.

    (Fragment kodu — ASP.NET laboratorium iniekcji zależności — Ex03 — konstruktor dostawcy filtrów)

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

    Uwaga

    Konstruktor klasy dostawcy filtru nie tworzy nowego obiektu wewnątrz. Kontener jest przekazywany jako parametr, a zależność jest rozwiązywana przez aparat Unity.

  7. W klasie FilterProvider zaimplementuj metodę GetFilters z interfejsu IFilterProvider.

    (Fragment kodu — ASP.NET laboratorium wstrzykiwania zależności — Ex03 — GetFilters dostawcy filtrów)

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

Zadanie 2 . Rejestrowanie i włączanie filtru

W tym zadaniu włączysz śledzenie witryn. W tym celu zarejestrujesz filtr w metodzie Bootstrapper.cs BuildUnityContainer , aby rozpocząć śledzenie:

  1. Otwórz plik Web.config znajdujący się w katalogu głównym projektu i włącz śledzenie śledzenia w grupie System.Web.

    <system.web>
        <trace enabled="true"/>
        <compilation debug="true" targetFramework="4.5">
    
  2. Otwórz Bootstrapper.cs w katalogu głównym projektu.

  3. Dodaj odwołanie do przestrzeni nazw MvcMusicStore.Filters .

    (Fragment kodu — ASP.NET laboratorium iniekcji zależności — Ex03 — Bootstrapper dodawanie przestrzeni nazw)

    using System.Web.Mvc;
    using Microsoft.Practices.Unity;
    using Unity.Mvc3;
    using MvcMusicStore.Services;
    using MvcMusicStore.Controllers;
    using MvcMusicStore.Factories;
    using MvcMusicStore.Filters;
    
  4. Wybierz metodę BuildUnityContainer i zarejestruj filtr w kontenerze aparatu Unity. Należy zarejestrować dostawcę filtru, a także filtr akcji.

    (Fragment kodu — ASP.NET Laboratorium iniekcji zależności — Ex03 — Rejestrowanie elementu FilterProvider i actionFilter)

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

Zadanie 3 — uruchamianie aplikacji

W tym zadaniu uruchomisz aplikację i sprawdzisz, czy filtr akcji niestandardowej śledzi działanie:

  1. Naciśnij klawisz F5, aby uruchomić aplikację.

  2. Kliknij pozycję Rock w menu Gatunki. Jeśli chcesz, możesz przejść do większej liczby gatunków.

    Music Store

    Music Store

  3. Przejdź do pliku /Trace.axd , aby wyświetlić stronę Śledzenie aplikacji, a następnie kliknij pozycję Wyświetl szczegóły.

    Dziennik śledzenia aplikacji

    Dziennik śledzenia aplikacji

    Śledzenie aplikacji — szczegóły żądania

    Śledzenie aplikacji — szczegóły żądania

  4. Zamknij okno przeglądarki.


Podsumowanie

Wykonując to praktyczne laboratorium, wiesz, jak używać wstrzykiwania zależności w programie ASP.NET MVC 4 przez zintegrowanie aparatu Unity z pakietem NuGet. Aby to osiągnąć, użyto wstrzykiwania zależności wewnątrz kontrolerów, widoków i filtrów akcji.

Omówiono następujące pojęcia:

  • ASP.NET funkcje wstrzykiwania zależności MVC 4
  • Integracja aparatu Unity przy użyciu pakietu NuGet Unity.Mvc3
  • Wstrzykiwanie zależności w kontrolerach
  • Wstrzykiwanie zależności w widokach
  • Wstrzykiwanie zależności filtrów akcji

Dodatek A: Instalowanie programu Visual Studio Express 2012 dla sieci Web

Program Microsoft Visual Studio Express 2012 dla sieci Web lub innej wersji "Express" można zainstalować przy użyciu Instalator platformy Microsoft Web. Poniższe instrukcje zawierają instrukcje wymagane do zainstalowania programu Visual Studio Express 2012 for Web przy użyciu Instalator platformy Microsoft Web.

  1. Przejdź do strony /iis/extensions/introduction-to-iis-express/iis-express-overview?linkid=9810169. Alternatywnie, jeśli masz już zainstalowany Instalator platformy internetowej, możesz go otworzyć i wyszukać produkt "Visual Studio Express 2012 for Web with Windows Azure SDK" (Program Visual Studio Express 2012 for Web with Windows Azure SDK).

  2. Kliknij pozycję Zainstaluj teraz. Jeśli nie masz Instalatora platformy internetowej, nastąpi przekierowanie do pobrania i zainstalowania go najpierw.

  3. Po otwarciu Instalatora platformy internetowej kliknij przycisk Zainstaluj , aby rozpocząć instalację.

    Instalowanie programu Visual Studio Express

    Instalowanie programu Visual Studio Express

  4. Przeczytaj wszystkie licencje i postanowienia dotyczące produktów, a następnie kliknij pozycję Akceptuję , aby kontynuować.

    Akceptowanie postanowień licencyjnych

    Akceptowanie postanowień licencyjnych

  5. Poczekaj na zakończenie procesu pobierania i instalacji.

    Postęp instalacji

    Postęp instalacji

  6. Po zakończeniu instalacji kliknij przycisk Zakończ.

    Ukończono instalację

    Ukończono instalację

  7. Kliknij przycisk Zakończ, aby zamknąć Instalatora platformy internetowej.

  8. Aby otworzyć program Visual Studio Express dla Sieci Web, przejdź do ekranu startowego i zacznij pisać "VS Express", a następnie kliknij kafelek VS Express for Web.

    Kafelek programu VS Express dla sieci Web

    Kafelek programu VS Express dla sieci Web

Dodatek B: Używanie fragmentów kodu

W przypadku fragmentów kodu masz cały potrzebny kod na wyciągnięcie ręki. Dokument laboratorium zawiera informacje o tym, kiedy można ich używać, jak pokazano na poniższej ilustracji.

Wstawianie kodu do projektu przy użyciu fragmentów kodu programu Visual Studio Code

Wstawianie kodu do projektu przy użyciu fragmentów kodu programu Visual Studio Code

Aby dodać fragment kodu przy użyciu klawiatury (tylko w języku C#)

  1. Umieść kursor, w którym chcesz wstawić kod.
  2. Zacznij wpisywać nazwę fragmentu kodu (bez spacji lub łączników).
  3. Zobacz, jak funkcja IntelliSense wyświetla pasujące nazwy fragmentów kodu.
  4. Wybierz poprawny fragment kodu (lub kontynuuj wpisywanie do momentu wybrania nazwy całego fragmentu kodu).
  5. Naciśnij dwukrotnie Tab, aby wstawić fragment kodu w lokalizacji kursora.

Zacznij wpisywać nazwę fragmentu kodu

Zacznij wpisywać nazwę fragmentu kodu

Naciśnij Tab, aby wybrać wyróżniony fragment kodu

Naciśnij Tab, aby wybrać wyróżniony fragment kodu

Ponownie naciśnij Tab, a fragment kodu zostanie rozwiń

Ponownie naciśnij Tab, a fragment kodu zostanie rozwiń

Aby dodać fragment kodu przy użyciu myszy (C#, Visual Basic i XML) 1. Kliknij prawym przyciskiem myszy miejsce, w którym chcesz wstawić fragment kodu.

  1. Wybierz pozycję Wstaw fragment kodu , a następnie pozycję Moje fragmenty kodu.
  2. Wybierz odpowiedni fragment kodu z listy, klikając go.

Kliknij prawym przyciskiem myszy miejsce, w którym chcesz wstawić fragment kodu, a następnie wybierz polecenie Wstaw fragment kodu

Kliknij prawym przyciskiem myszy miejsce, w którym chcesz wstawić fragment kodu, a następnie wybierz polecenie Wstaw fragment kodu

Wybierz odpowiedni fragment kodu z listy, klikając go

Wybierz odpowiedni fragment kodu z listy, klikając go