Bagikan melalui


ASP.NET Injeksi Dependensi MVC 4

Oleh Tim Perkemahan Web

Unduh Kit Pelatihan Kamp Web

Lab Langsung ini mengasumsikan Anda memiliki pengetahuan dasar tentang ASP.NET MVC dan ASP.NET filter MVC 4. Jika Anda belum menggunakan filter ASP.NET MVC 4 sebelumnya, kami sarankan Anda untuk membahas ASP.NET MVC Custom Action Filters Hands-on Lab.

Catatan

Semua kode sampel dan cuplikan disertakan dalam Kit Pelatihan Kamp Web, tersedia dari di Rilis Microsoft-Web/WebCampTrainingKit. Proyek khusus untuk lab ini tersedia di ASP.NET Injeksi Dependensi MVC 4.

Dalam paradigma Pemrograman Berorientasi Objek, objek bekerja sama dalam model kolaborasi di mana ada kontributor dan konsumen. Secara alami, model komunikasi ini menghasilkan dependensi antara objek dan komponen, menjadi sulit dikelola ketika kompleksitas meningkat.

Dependensi kelas dan kompleksitas model

Dependensi kelas dan kompleksitas model

Anda mungkin telah mendengar tentang Pola Pabrik dan pemisahan antara antarmuka dan implementasi menggunakan layanan, di mana objek klien sering bertanggung jawab atas lokasi layanan.

Pola Injeksi Dependensi adalah implementasi tertentu dari Inversi Kontrol. Inversi Kontrol (IoC) berarti bahwa objek tidak membuat objek lain yang diandalkan untuk melakukan pekerjaan mereka. Sebaliknya, mereka mendapatkan objek yang mereka butuhkan dari sumber luar (misalnya, file konfigurasi xml).

Injeksi Dependensi (DI) berarti bahwa ini dilakukan tanpa intervensi objek, biasanya oleh komponen kerangka kerja yang melewati parameter konstruktor dan mengatur properti.

Pola Desain Injeksi Dependensi (DI)

Pada tingkat tinggi, tujuan dari Injeksi Dependensi adalah bahwa kelas klien (misalnya pegolf) membutuhkan sesuatu yang memenuhi antarmuka (misalnya IClub). Tidak peduli apa jenis konkretnya (misalnya WoodClub, IronClub, WedgeClub atau PutterClub), ia ingin orang lain untuk menangani itu (misalnya caddy yang baik). Resolver Dependensi di ASP.NET MVC dapat memungkinkan Anda untuk mendaftarkan logika dependensi Anda di tempat lain (misalnya kontainer atau sekantong klub).

Diagram Injeksi Dependensi

Injeksi Dependensi - Analogi golf

Keuntungan menggunakan pola Injeksi Dependensi dan Inversi Kontrol adalah sebagai berikut:

  • Mengurangi kopling kelas
  • Meningkatkan pengunaan ulang kode
  • Meningkatkan ketahanan kode
  • Meningkatkan pengujian aplikasi

Catatan

Injeksi Dependensi terkadang dibandingkan dengan Pola Desain Pabrik Abstrak, tetapi ada sedikit perbedaan antara kedua pendekatan. DI memiliki Kerangka Kerja yang bekerja di belakang untuk menyelesaikan dependensi dengan memanggil pabrik dan layanan terdaftar.

Sekarang setelah Anda memahami Pola Injeksi Dependensi, Anda akan mempelajari di seluruh lab ini cara menerapkannya di ASP.NET MVC 4. Anda akan mulai menggunakan Injeksi Dependensi di Pengontrol untuk menyertakan layanan akses database. Selanjutnya, Anda akan menerapkan Injeksi Dependensi ke Tampilan untuk menggunakan layanan dan menampilkan informasi. Terakhir, Anda akan memperluas DI ke ASP.NET Filter MVC 4, menyuntikkan filter tindakan kustom dalam solusi.

Di Lab Langsung ini, Anda akan mempelajari cara:

  • Integrasikan ASP.NET MVC 4 dengan Unity untuk Injeksi Dependensi menggunakan Paket NuGet
  • Menggunakan Injeksi Dependensi di dalam Pengontrol MVC ASP.NET
  • Menggunakan Injeksi Dependensi di dalam Tampilan MVC ASP.NET
  • Menggunakan Injeksi Dependensi di dalam Filter Tindakan MVC ASP.NET

Catatan

Lab ini menggunakan Paket NuGet Unity.Mvc3 untuk resolusi dependensi, tetapi dimungkinkan untuk menyesuaikan Kerangka Kerja Injeksi Dependensi apa pun untuk bekerja dengan ASP.NET MVC 4.

Prasyarat

Anda harus memiliki item berikut untuk menyelesaikan lab ini:

Siapkan

Menginstal Cuplikan Kode

Untuk kenyamanan, banyak kode yang akan Anda kelola di sepanjang lab ini tersedia sebagai cuplikan kode Visual Studio. Untuk menginstal cuplikan kode, jalankan file .\Source\Setup\CodeSnippets.vsi .

Jika Anda tidak terbiasa dengan Cuplikan Visual Studio Code, dan ingin mempelajari cara menggunakannya, Anda dapat merujuk ke lampiran dari dokumen ini "Lampiran B: Menggunakan Cuplikan Kode".


Latihan

Lab Langsung ini terdiri dari latihan berikut:

  1. Latihan 1: Menyuntikkan Pengontrol
  2. Latihan 2: Menyuntikkan Tampilan
  3. Latihan 3: Menyuntikkan Filter

Catatan

Setiap latihan disertai dengan folder Akhir yang berisi solusi yang dihasilkan yang harus Anda peroleh setelah menyelesaikan latihan. Anda dapat menggunakan solusi ini sebagai panduan jika Anda memerlukan bantuan tambahan untuk mengerjakan latihan.

Perkiraan waktu untuk menyelesaikan lab ini: 30 menit.

Latihan 1: Menyuntikkan Pengontrol

Dalam latihan ini, Anda akan mempelajari cara menggunakan Injeksi Dependensi di ASP.NET Pengontrol MVC dengan mengintegrasikan Unity menggunakan Paket NuGet. Untuk alasan itu, Anda akan menyertakan layanan ke dalam pengontrol MvcMusicStore Anda untuk memisahkan logika dari akses data. Layanan akan membuat dependensi baru di konstruktor pengontrol, yang akan diselesaikan menggunakan Injeksi Dependensi dengan bantuan Unity.

Pendekatan ini akan menunjukkan kepada Anda cara menghasilkan lebih sedikit aplikasi yang digabungkan, yang lebih fleksibel dan lebih mudah dipertahankan dan diuji. Anda juga akan mempelajari cara mengintegrasikan ASP.NET MVC dengan Unity.

Tentang StoreManager Service

MVC Music Store yang disediakan dalam solusi mulai sekarang mencakup layanan yang mengelola data Pengontrol Toko bernama StoreService. Di bawah ini Anda akan menemukan implementasi Layanan Toko. Perhatikan bahwa semua metode mengembalikan entitas 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 dari solusi awal sekarang menggunakan StoreService. Semua referensi data dihapus dari StoreController, dan sekarang dimungkinkan untuk memodifikasi penyedia akses data saat ini tanpa mengubah metode apa pun yang menggunakan StoreService.

Anda akan menemukan di bawah ini bahwa implementasi StoreController memiliki dependensi dengan StoreService di dalam konstruktor kelas.

Catatan

Dependensi yang diperkenalkan dalam latihan ini terkait dengan Inversion of Control (IoC).

Konstruktor kelas StoreController menerima parameter jenis IStoreService, yang penting untuk melakukan panggilan layanan dari dalam kelas. Namun, StoreController tidak mengimplementasikan konstruktor default (tanpa parameter) yang harus dikerjakan oleh pengontrol apa pun ASP.NET MVC.

Untuk mengatasi dependensi, pengontrol harus dibuat oleh pabrik abstrak (kelas yang mengembalikan objek apa pun dari jenis yang ditentukan).

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

Catatan

Anda akan mendapatkan kesalahan ketika kelas mencoba membuat StoreController tanpa mengirim objek layanan, karena tidak ada konstruktor tanpa parameter yang dideklarasikan.

Tugas 1 - Menjalankan Aplikasi

Dalam tugas ini, Anda akan menjalankan aplikasi Begin, yang mencakup layanan ke dalam Store Controller yang memisahkan akses data dari logika aplikasi.

Saat menjalankan aplikasi, Anda akan menerima pengecualian, karena layanan pengontrol tidak diteruskan sebagai parameter secara default:

  1. Buka solusi Mulai yang terletak di Source\Ex01-Injecting Controller\Begin.

    1. Anda harus mengunduh beberapa paket NuGet yang hilang sebelum melanjutkan. Untuk melakukan ini, klik menu Proyek dan pilih Kelola Paket NuGet.

    2. Dalam dialog Kelola Paket NuGet, klik Pulihkan untuk mengunduh paket yang hilang.

    3. Terakhir, bangun solusi dengan mengklik Build | Build Solution.

      Catatan

      Salah satu keuntungan menggunakan NuGet adalah Anda tidak perlu mengirim semua pustaka dalam proyek Anda, mengurangi ukuran proyek. Dengan NuGet Power Tools, dengan menentukan versi paket dalam file Packages.config, Anda akan dapat mengunduh semua pustaka yang diperlukan saat pertama kali menjalankan proyek. Inilah sebabnya mengapa Anda harus menjalankan langkah-langkah ini setelah Anda membuka solusi yang ada dari lab ini.

  2. Tekan Ctrl + F5 untuk menjalankan aplikasi tanpa penelusuran kesalahan. Anda akan mendapatkan pesan kesalahan "Tidak ada konstruktor tanpa parameter yang ditentukan untuk objek ini":

    Kesalahan saat menjalankan Aplikasi Mulai MVC ASP.NET

    Kesalahan saat menjalankan Aplikasi Mulai MVC ASP.NET

  3. Tutup browser.

Dalam langkah-langkah berikut, Anda akan mengerjakan Solusi Music Store untuk menyuntikkan dependensi yang dibutuhkan pengontrol ini.

Tugas 2 - Menyertakan Unity ke dalam MvcMusicStore Solution

Dalam tugas ini, Anda akan menyertakan Paket NuGet Unity.Mvc3 ke solusi.

Catatan

Paket Unity.Mvc3 dirancang untuk ASP.NET MVC 3, tetapi sepenuhnya kompatibel dengan ASP.NET MVC 4.

Unity adalah kontainer injeksi dependensi yang ringan dan dapat diperluas dengan dukungan opsional untuk intersepsi instans dan jenis. Ini adalah kontainer tujuan umum untuk digunakan dalam semua jenis aplikasi .NET. Ini menyediakan semua fitur umum yang ditemukan dalam mekanisme injeksi dependensi termasuk: pembuatan objek, abstraksi persyaratan dengan menentukan dependensi pada runtime dan fleksibilitas, dengan menunda konfigurasi komponen ke kontainer.

  1. Instal Paket NuGet Unity.Mvc3 di proyek MvcMusicStore . Untuk melakukan ini, buka Konsol Manajer Paket dari Lihat | Windows Lain.

  2. Jalankan perintah berikut.

    PMC

    Install-Package Unity.Mvc3
    

    Menginstal Paket NuGet Unity.Mvc3

    Menginstal Paket NuGet Unity.Mvc3

  3. Setelah paket Unity.Mvc3 diinstal, jelajahi file dan folder yang ditambahkannya secara otomatis untuk menyederhanakan konfigurasi Unity.

    Paket Unity.Mvc3 terinstal

    Paket Unity.Mvc3 terinstal

Tugas 3 - Mendaftarkan Unity di Global.asax.cs Application_Start

Dalam tugas ini, Anda akan memperbarui metode Application_Start yang terletak di Global.asax.cs untuk memanggil inisialisasi Unity Bootstrapper dan kemudian, memperbarui file Bootstrapper yang mendaftarkan Layanan dan Pengontrol yang akan Anda gunakan untuk Injeksi Dependensi.

  1. Sekarang, Anda akan menghubungkan Bootstrapper yang merupakan file yang menginisialisasi kontainer Unity dan Pemecah Dependensi. Untuk melakukan ini, buka Global.asax.cs dan tambahkan kode yang disorot berikut dalam metode Application_Start .

    (Cuplikan Kode - ASP.NET Lab Injeksi Dependensi - Ex01 - Inisialisasi 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. Buka file Bootstrapper.cs .

  3. Sertakan namespace berikut: MvcMusicStore.Services dan MusicStore.Controllers.

    (Cuplikan Kode - ASP.NET Lab Injeksi Dependensi - Ex01 - Bootstrapper Menambahkan Namespace)

    using System.Web.Mvc;
    using Microsoft.Practices.Unity;
    using Unity.Mvc3;
    using MvcMusicStore.Services;
    using MvcMusicStore.Controllers;
    
  4. Ganti konten metode BuildUnityContainer dengan kode berikut yang mendaftarkan Store Controller dan Store Service.

    (Cuplikan Kode - ASP.NET Lab Injeksi Dependensi - Ex01 - Daftarkan Pengontrol dan Layanan Toko)

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

Tugas 4 - Menjalankan Aplikasi

Dalam tugas ini, Anda akan menjalankan aplikasi untuk memverifikasi bahwa aplikasi sekarang dapat dimuat setelah menyertakan Unity.

  1. Tekan F5 untuk menjalankan aplikasi, aplikasi sekarang harus dimuat tanpa menampilkan pesan kesalahan apa pun.

    Menjalankan Aplikasi dengan Injeksi Dependensi

    Menjalankan Aplikasi dengan Injeksi Dependensi

  2. Telusuri ke /Store. Ini akan memanggil StoreController, yang sekarang dibuat menggunakan Unity.

    MVC Music Store

    MVC Music Store

  3. Tutup browser.

Dalam latihan berikut, Anda akan mempelajari cara memperluas cakupan Injeksi Dependensi untuk menggunakannya di dalam ASP.NET Tampilan MVC dan Filter Tindakan.

Latihan 2: Menyuntikkan Tampilan

Dalam latihan ini, Anda akan mempelajari cara menggunakan Injeksi Dependensi dalam tampilan dengan fitur baru ASP.NET MVC 4 untuk integrasi Unity. Untuk melakukannya, Anda akan memanggil layanan kustom di dalam Tampilan Telusuri Toko, yang akan menampilkan pesan dan gambar di bawah ini.

Kemudian, Anda akan mengintegrasikan proyek dengan Unity dan membuat pemecah masalah dependensi kustom untuk menyuntikkan dependensi.

Tugas 1 - Membuat Tampilan yang Menggunakan Layanan

Dalam tugas ini, Anda akan membuat tampilan yang melakukan panggilan layanan untuk menghasilkan dependensi baru. Layanan ini terdiri dari layanan olahpesan sederhana yang disertakan dalam solusi ini.

  1. Buka solusi Mulai yang terletak di folder Source\Ex02-Injecting View\Begin. Jika tidak, Anda mungkin terus menggunakan solusi Akhir yang diperoleh dengan menyelesaikan latihan sebelumnya.

    1. Jika Anda membuka solusi Mulai yang disediakan, Anda harus mengunduh beberapa paket NuGet yang hilang sebelum melanjutkan. Untuk melakukan ini, klik menu Proyek dan pilih Kelola Paket NuGet.

    2. Dalam dialog Kelola Paket NuGet, klik Pulihkan untuk mengunduh paket yang hilang.

    3. Terakhir, bangun solusi dengan mengklik Build | Build Solution.

      Catatan

      Salah satu keuntungan menggunakan NuGet adalah Anda tidak perlu mengirim semua pustaka dalam proyek Anda, mengurangi ukuran proyek. Dengan NuGet Power Tools, dengan menentukan versi paket dalam file Packages.config, Anda akan dapat mengunduh semua pustaka yang diperlukan saat pertama kali menjalankan proyek. Inilah sebabnya mengapa Anda harus menjalankan langkah-langkah ini setelah Anda membuka solusi yang ada dari lab ini.

      Untuk informasi selengkapnya, lihat artikel ini: https://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages.

  2. Sertakan MessageService.cs dan kelas IMessageService.cs yang terletak di folder Sumber \Aset di /Services. Untuk melakukan ini, klik kanan folder Layanan dan pilih Tambahkan Item yang Ada. Telusuri ke lokasi file dan sertakan.

    Menambahkan Layanan Pesan dan Antarmuka Layanan

    Menambahkan Layanan Pesan dan Antarmuka Layanan

    Catatan

    Antarmuka IMessageService menentukan dua properti yang diterapkan oleh kelas MessageService . Properti ini -Pesan dan ImageUrl- simpan pesan dan URL gambar yang akan ditampilkan.

  3. Buat folder /Pages di folder akar proyek, lalu tambahkan kelas yang ada MyBasePage.cs dari Source\Assets. Halaman dasar yang akan Anda warisi memiliki struktur berikut.

    Folder Halaman

    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. Buka tampilan Browse.cshtml dari folder /Views/Store , dan buatlah mewarisi dari MyBasePage.cs.

    @inherits MvcMusicStore.Pages.MyBasePage
    @{
         ViewBag.Title = "Browse Albums";
    }
    
  5. Dalam tampilan Telusuri, tambahkan panggilan ke MessageService untuk menampilkan gambar dan pesan yang diambil oleh layanan. (C#)

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

Tugas 2 - Menyertakan Penyelesai Dependensi Kustom dan Pengaktif Halaman Tampilan Kustom

Dalam tugas sebelumnya, Anda menyuntikkan dependensi baru di dalam tampilan untuk melakukan panggilan layanan di dalamnya. Sekarang, Anda akan menyelesaikan dependensi tersebut dengan menerapkan antarmuka Injeksi Dependensi MVC ASP.NET IViewPageActivator dan IDependencyResolver. Anda akan menyertakan dalam solusi implementasi IDependencyResolver yang akan menangani pengambilan layanan dengan menggunakan Unity. Kemudian, Anda akan menyertakan implementasi kustom lain dari antarmuka IViewPageActivator yang akan menyelesaikan pembuatan tampilan.

Catatan

Sejak ASP.NET MVC 3, implementasi untuk Injeksi Dependensi telah menyederhanakan antarmuka untuk mendaftarkan layanan. IDependencyResolver dan IViewPageActivator adalah bagian dari fitur ASP.NET MVC 3 untuk Injeksi Dependensi.

- Antarmuka IDependencyResolver menggantikan IMvcServiceLocator sebelumnya. Implementer IDependencyResolver harus mengembalikan instans layanan atau koleksi layanan.

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

- Antarmuka IViewPageActivator memberikan kontrol yang lebih halus atas cara halaman tampilan dibuat melalui injeksi dependensi. Kelas yang mengimplementasikan antarmuka IViewPageActivator dapat membuat instans tampilan menggunakan informasi konteks.

public interface IViewPageActivator {
    object Create(ControllerContext controllerContext, Type type);
}
  1. Buat folder /Factories di folder akar proyek.

  2. Sertakan CustomViewPageActivator.cs ke solusi Anda dari folder /Sources/Assets/ ke Factories . Untuk melakukannya, klik kanan folder /Factories , pilih Tambahkan | Item yang Ada lalu pilih CustomViewPageActivator.cs. Kelas ini mengimplementasikan antarmuka IViewPageActivator untuk menahan Kontainer 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);
            }
        }
    }
    

    Catatan

    CustomViewPageActivator bertanggung jawab untuk mengelola pembuatan tampilan dengan menggunakan kontainer Unity.

  3. Sertakan file UnityDependencyResolver.cs dari folder /Sources/Assets ke /Factories . Untuk melakukannya, klik kanan folder /Factories , pilih Tambahkan | Item yang Ada lalu pilih 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);
                    }
              }
         }
    }
    

    Catatan

    Kelas UnityDependencyResolver adalah DependencyResolver kustom untuk Unity. Ketika layanan tidak dapat ditemukan di dalam kontainer Unity, pemecah masalah dasar dipanggil.

Dalam tugas berikut, kedua implementasi akan didaftarkan untuk memberi tahu model lokasi layanan dan tampilan.

Tugas 3 - Mendaftar untuk Injeksi Dependensi dalam kontainer Unity

Dalam tugas ini, Anda akan menyatukan semua hal sebelumnya untuk membuat Injeksi Dependensi berfungsi.

Hingga sekarang solusi Anda memiliki elemen berikut:

  • Tampilan Telusuri yang mewarisi dari MyBaseClass dan menggunakan MessageService.
  • Kelas menengah -MyBaseClass- yang memiliki injeksi dependensi yang dideklarasikan untuk antarmuka layanan.
  • Layanan - MessageService - dan antarmukanya IMessageService.
  • Resolver dependensi kustom untuk Unity - UnityDependencyResolver - yang berkaitan dengan pengambilan layanan.
  • Pengaktif Halaman Tampilan - CustomViewPageActivator - yang membuat halaman.

Untuk menyuntikkan Tampilan Telusuri, Anda sekarang akan mendaftarkan pemecah masalah dependensi kustom di kontainer Unity.

  1. Buka file Bootstrapper.cs .

  2. Daftarkan instans MessageService ke dalam kontainer Unity untuk menginisialisasi layanan:

    (Cuplikan Kode - ASP.NET Lab Injeksi Dependensi - Ex02 - Daftarkan Layanan Pesan)

    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. Tambahkan referensi ke namespace layanan MvcMusicStore.Factories .

    (Cuplikan Kode - ASP.NET Dependensi Injection Lab - Ex02 - Factories Namespace)

    using System.Web.Mvc; 
    using Microsoft.Practices.Unity; 
    using Unity.Mvc3; 
    using MvcMusicStore.Services; 
    using MvcMusicStore.Controllers; 
    using MvcMusicStore.Factories;
    
  4. Daftarkan CustomViewPageActivator sebagai aktivator Lihat Halaman ke dalam kontainer Unity:

    (Cuplikan Kode - ASP.NET Lab Injeksi Dependensi - Ex02 - Daftarkan 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. Ganti ASP.NET penyelesai dependensi default MVC 4 dengan instans UnityDependencyResolver. Untuk melakukan ini, ganti Inisialisasi konten metode dengan kode berikut:

    (Cuplikan Kode - ASP.NET Lab Injeksi Dependensi - Ex02 - Perbarui Pemecah Masalah Dependensi)

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

    Catatan

    ASP.NET MVC menyediakan kelas pemecah masalah dependensi default. Untuk bekerja dengan pemecah masalah dependensi kustom sebagai yang telah kami buat untuk unity, pemecah masalah ini harus diganti.

Tugas 4 - Menjalankan Aplikasi

Dalam tugas ini, Anda akan menjalankan aplikasi untuk memverifikasi bahwa Browser Toko menggunakan layanan dan menampilkan gambar dan pesan yang diambil:

  1. Tekan F5 untuk menjalankan aplikasi.

  2. Klik Rock dalam Menu Genre dan lihat bagaimana MessageService disuntikkan ke tampilan dan memuat pesan selamat datang dan gambar. Dalam contoh ini, kita masuk ke "Rock":

    MVC Music Store - Lihat Injeksi

    MVC Music Store - Lihat Injeksi

  3. Tutup browser.

Latihan 3: Menyuntikkan Filter Tindakan

Di lab Hands-On Filter Tindakan Kustom sebelumnya, Anda telah bekerja dengan kustomisasi dan injeksi filter. Dalam latihan ini, Anda akan mempelajari cara menyuntikkan filter dengan Injeksi Dependensi dengan menggunakan kontainer Unity. Untuk melakukannya, Anda akan menambahkan ke solusi Music Store filter tindakan kustom yang akan melacak aktivitas situs.

Tugas 1 - Menyertakan Filter Pelacakan dalam Solusi

Dalam tugas ini, Anda akan menyertakan di Penyimpanan Musik filter tindakan kustom untuk melacak peristiwa. Karena konsep filter tindakan kustom sudah diperlakukan di Lab sebelumnya "Filter Tindakan Kustom", Anda hanya akan menyertakan kelas filter dari folder Aset lab ini, lalu membuat Penyedia Filter untuk Unity:

  1. Buka solusi Mulai yang terletak di folder Source\Ex03 - Injecting Action Filter\Begin. Jika tidak, Anda mungkin terus menggunakan solusi Akhir yang diperoleh dengan menyelesaikan latihan sebelumnya.

    1. Jika Anda membuka solusi Mulai yang disediakan, Anda harus mengunduh beberapa paket NuGet yang hilang sebelum melanjutkan. Untuk melakukan ini, klik menu Proyek dan pilih Kelola Paket NuGet.

    2. Dalam dialog Kelola Paket NuGet, klik Pulihkan untuk mengunduh paket yang hilang.

    3. Terakhir, bangun solusi dengan mengklik Build | Build Solution.

      Catatan

      Salah satu keuntungan menggunakan NuGet adalah Anda tidak perlu mengirim semua pustaka dalam proyek Anda, mengurangi ukuran proyek. Dengan NuGet Power Tools, dengan menentukan versi paket dalam file Packages.config, Anda akan dapat mengunduh semua pustaka yang diperlukan saat pertama kali menjalankan proyek. Inilah sebabnya mengapa Anda harus menjalankan langkah-langkah ini setelah Anda membuka solusi yang ada dari lab ini.

      Untuk informasi selengkapnya, lihat artikel ini: https://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages.

  2. Sertakan file TraceActionFilter.cs dari folder /Sources/Assets ke /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);
            }
        }
    }
    

    Catatan

    Filter tindakan kustom ini melakukan pelacakan ASP.NET. Anda dapat memeriksa Lab "ASP.NET MVC 4 Filter Tindakan Lokal dan Dinamis" untuk referensi selengkapnya.

  3. Tambahkan kelas kosong FilterProvider.cs ke proyek di folder /Filters.

  4. Tambahkan namespace System.Web.Mvc dan Microsoft.Practices.Unity di FilterProvider.cs.

    (Cuplikan Kode - ASP.NET Lab Injeksi Dependensi - Ex03 - Penyedia Filter Menambahkan Namespace Layanan)

    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. Buat kelas mewarisi dari Antarmuka IFilterProvider .

    namespace MvcMusicStore.Filters
    {
        public class FilterProvider : IFilterProvider
        {
        }
    }
    
  6. Tambahkan properti IUnityContainer di kelas FilterProvider, lalu buat konstruktor kelas untuk menetapkan kontainer.

    (Cuplikan Kode - ASP.NET Lab Injeksi Dependensi - Ex03 - Konstruktor Penyedia Filter)

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

    Catatan

    Konstruktor kelas penyedia filter tidak membuat objek baru di dalamnya. Kontainer diteruskan sebagai parameter, dan dependensi diselesaikan oleh Unity.

  7. Di kelas FilterProvider, terapkan metode GetFilters dari antarmuka IFilterProvider.

    (Cuplikan Kode - ASP.NET Lab Injeksi Dependensi - Ex03 - Filter Provider GetFilters)

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

Tugas 2 - Mendaftarkan dan Mengaktifkan Filter

Dalam tugas ini, Anda akan mengaktifkan pelacakan situs. Untuk melakukannya, Anda akan mendaftarkan filter dalam metode Bootstrapper.cs BuildUnityContainer untuk mulai melacak:

  1. Buka Web.config yang terletak di akar proyek dan aktifkan pelacakan pelacakan di grup System.Web.

    <system.web>
        <trace enabled="true"/>
        <compilation debug="true" targetFramework="4.5">
    
  2. Buka Bootstrapper.cs di akar proyek.

  3. Tambahkan referensi ke namespace layanan MvcMusicStore.Filters .

    (Cuplikan Kode - ASP.NET Dependensi Injection Lab - Ex03 - Bootstrapper Menambahkan Namespace)

    using System.Web.Mvc;
    using Microsoft.Practices.Unity;
    using Unity.Mvc3;
    using MvcMusicStore.Services;
    using MvcMusicStore.Controllers;
    using MvcMusicStore.Factories;
    using MvcMusicStore.Filters;
    
  4. Pilih metode BuildUnityContainer dan daftarkan filter di Kontainer Unity. Anda harus mendaftarkan penyedia filter serta filter tindakan.

    (Cuplikan Kode - ASP.NET Lab Injeksi Dependensi - Ex03 - Daftarkan FilterProvider dan ActionFilter)

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

Tugas 3 - Menjalankan Aplikasi

Dalam tugas ini, Anda akan menjalankan aplikasi dan menguji bahwa filter tindakan kustom melacak aktivitas:

  1. Tekan F5 untuk menjalankan aplikasi.

  2. Klik Rock di dalam Menu Genre. Anda dapat menelusuri ke lebih banyak genre jika anda mau.

    Penyimpanan Musik

    Penyimpanan Musik

  3. Telusuri ke /Trace.axd untuk melihat halaman Pelacakan Aplikasi, lalu klik Tampilkan Detail.

    Log Pelacakan Aplikasi

    Log Pelacakan Aplikasi

    Jejak Aplikasi - Detail Permintaan

    Jejak Aplikasi - Detail Permintaan

  4. Tutup browser.


Ringkasan

Dengan menyelesaikan Lab Hands-On ini, Anda telah mempelajari cara menggunakan Injeksi Dependensi di ASP.NET MVC 4 dengan mengintegrasikan Unity menggunakan Paket NuGet. Untuk mencapainya, Anda telah menggunakan Injeksi Dependensi di dalam pengontrol, tampilan, dan filter tindakan.

Konsep berikut tercakup:

  • ASP.NET fitur Injeksi Dependensi MVC 4
  • Integrasi Unity menggunakan Paket NuGet Unity.Mvc3
  • Injeksi Dependensi dalam Pengontrol
  • Injeksi Dependensi dalam Tampilan
  • Injeksi dependensi Filter Tindakan

Lampiran A: Menginstal Visual Studio Express 2012 untuk Web

Anda dapat menginstal Microsoft Visual Studio Express 2012 untuk Web atau versi "Ekspres" lainnya menggunakan Microsoft Web Platform Installer. Instruksi berikut memandu Anda melalui langkah-langkah yang diperlukan untuk menginstal Visual studio Express 2012 untuk Web menggunakan Microsoft Web Platform Installer.

  1. Buka /iis/extensions/introduction-to-iis-express/iis-express-overview?linkid=9810169. Atau, jika Anda sudah menginstal Penginstal Platform Web, Anda dapat membukanya dan mencari produk "Visual Studio Express 2012 untuk Web dengan Windows Azure SDK".

  2. Klik Instal Sekarang. Jika Anda tidak memiliki Penginstal Platform Web, Anda akan diarahkan untuk mengunduh dan menginstalnya terlebih dahulu.

  3. Setelah Penginstal Platform Web terbuka, klik Instal untuk memulai penyiapan.

    Menginstal Visual Studio Express

    Menginstal Visual Studio Express

  4. Baca semua lisensi dan ketentuan produk dan klik Saya Terima untuk melanjutkan.

    Menerima persyaratan lisensi

    Menerima persyaratan lisensi

  5. Tunggu hingga proses pengunduhan dan penginstalan selesai.

    Kemajuan instalasi

    Kemajuan penginstalan

  6. Setelah penginstalan selesai, klik Selesai.

    Penginstalan selesai

    Penginstalan selesai

  7. Klik Keluar untuk menutup Penginstal Platform Web.

  8. Untuk membuka Visual Studio Express for Web, buka layar Mulai dan mulai menulis "VS Express", lalu klik petak VS Express untuk Web .

    Vs Express untuk petak web

    Vs Express untuk petak web

Lampiran B: Menggunakan Cuplikan Kode

Dengan cuplikan kode, Anda memiliki semua kode yang Anda butuhkan di ujung jari Anda. Dokumen lab akan memberi tahu Anda kapan tepatnya Anda dapat menggunakannya, seperti yang ditunjukkan pada gambar berikut.

Menggunakan cuplikan kode Visual Studio untuk menyisipkan kode ke dalam proyek Anda

Menggunakan cuplikan kode Visual Studio untuk menyisipkan kode ke dalam proyek Anda

Untuk menambahkan cuplikan kode menggunakan keyboard (hanya C#)

  1. Tempatkan kursor tempat Anda ingin menyisipkan kode.
  2. Mulai ketik nama cuplikan (tanpa spasi atau tanda hubung).
  3. Tonton saat IntelliSense menampilkan nama cuplikan yang cocok.
  4. Pilih cuplikan yang benar (atau terus ketik hingga seluruh nama cuplikan dipilih).
  5. Tekan tombol Tab dua kali untuk menyisipkan cuplikan di lokasi kursor.

Mulai ketik nama cuplikan

Mulai ketik nama cuplikan

Tekan Tab untuk memilih cuplikan yang disorot

Tekan Tab untuk memilih cuplikan yang disorot

Tekan Tab lagi dan cuplikan akan diperluas

Tekan Tab lagi dan cuplikan akan diperluas

Untuk menambahkan cuplikan kode menggunakan mouse (C#, Visual Basic dan XML) 1. Klik kanan tempat Anda ingin menyisipkan cuplikan kode.

  1. Pilih Sisipkan Cuplikan diikuti dengan Cuplikan Kode Saya.
  2. Pilih cuplikan yang relevan dari daftar, dengan mengkliknya.

Klik kanan tempat Anda ingin menyisipkan cuplikan kode dan pilih Sisipkan Cuplikan

Klik kanan tempat Anda ingin menyisipkan cuplikan kode dan pilih Sisipkan Cuplikan

Pilih cuplikan yang relevan dari daftar, dengan mengkliknya

Pilih cuplikan yang relevan dari daftar, dengan mengkliknya