Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Oleh Tim Perkemahan 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
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).

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:
- Microsoft Visual Studio Express 2012 untuk Web atau superior (baca Lampiran A untuk petunjuk tentang cara menginstalnya).
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:
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:
Buka solusi Mulai yang terletak di Source\Ex01-Injecting Controller\Begin.
Anda harus mengunduh beberapa paket NuGet yang hilang sebelum melanjutkan. Untuk melakukan ini, klik menu Proyek dan pilih Kelola Paket NuGet.
Dalam dialog Kelola Paket NuGet, klik Pulihkan untuk mengunduh paket yang hilang.
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.
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
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.
Instal Paket NuGet Unity.Mvc3 di proyek MvcMusicStore . Untuk melakukan ini, buka Konsol Manajer Paket dari Lihat | Windows Lain.
Jalankan perintah berikut.
PMC
Install-Package Unity.Mvc3
Menginstal Paket NuGet Unity.Mvc3
Setelah paket Unity.Mvc3 diinstal, jelajahi file dan folder yang ditambahkannya secara otomatis untuk menyederhanakan konfigurasi Unity.

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.
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(); }Buka file Bootstrapper.cs .
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;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.
Tekan F5 untuk menjalankan aplikasi, aplikasi sekarang harus dimuat tanpa menampilkan pesan kesalahan apa pun.

Menjalankan Aplikasi dengan Injeksi Dependensi
Telusuri ke /Store. Ini akan memanggil StoreController, yang sekarang dibuat menggunakan Unity.

MVC Music Store
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.
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.
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.
Dalam dialog Kelola Paket NuGet, klik Pulihkan untuk mengunduh paket yang hilang.
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.
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
Catatan
Antarmuka IMessageService menentukan dua properti yang diterapkan oleh kelas MessageService . Properti ini -Pesan dan ImageUrl- simpan pesan dan URL gambar yang akan ditampilkan.
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.

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() { } } }Buka tampilan Browse.cshtml dari folder /Views/Store , dan buatlah mewarisi dari MyBasePage.cs.
@inherits MvcMusicStore.Pages.MyBasePage @{ ViewBag.Title = "Browse Albums"; }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);
}
Buat folder /Factories di folder akar proyek.
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.
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.
Buka file Bootstrapper.cs .
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" }); //... }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;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; }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:
Tekan F5 untuk menjalankan aplikasi.
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
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:
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.
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.
Dalam dialog Kelola Paket NuGet, klik Pulihkan untuk mengunduh paket yang hilang.
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.
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.
Tambahkan kelas kosong FilterProvider.cs ke proyek di folder /Filters.
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 { } }Buat kelas mewarisi dari Antarmuka IFilterProvider .
namespace MvcMusicStore.Filters { public class FilterProvider : IFilterProvider { } }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.
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:
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">Buka Bootstrapper.cs di akar proyek.
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;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:
Tekan F5 untuk menjalankan aplikasi.
Klik Rock di dalam Menu Genre. Anda dapat menelusuri ke lebih banyak genre jika anda mau.

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

Log Pelacakan Aplikasi

Jejak Aplikasi - Detail Permintaan
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.
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".
Klik Instal Sekarang. Jika Anda tidak memiliki Penginstal Platform Web, Anda akan diarahkan untuk mengunduh dan menginstalnya terlebih dahulu.
Setelah Penginstal Platform Web terbuka, klik Instal untuk memulai penyiapan.

Menginstal Visual Studio Express
Baca semua lisensi dan ketentuan produk dan klik Saya Terima untuk melanjutkan.

Menerima persyaratan lisensi
Tunggu hingga proses pengunduhan dan penginstalan selesai.

Kemajuan penginstalan
Setelah penginstalan selesai, klik Selesai.

Penginstalan selesai
Klik Keluar untuk menutup Penginstal Platform Web.
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
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
Untuk menambahkan cuplikan kode menggunakan keyboard (hanya C#)
- Tempatkan kursor tempat Anda ingin menyisipkan kode.
- Mulai ketik nama cuplikan (tanpa spasi atau tanda hubung).
- Tonton saat IntelliSense menampilkan nama cuplikan yang cocok.
- Pilih cuplikan yang benar (atau terus ketik hingga seluruh nama cuplikan dipilih).
- Tekan tombol Tab dua kali untuk menyisipkan cuplikan di lokasi kursor.

Mulai ketik nama cuplikan

Tekan Tab untuk memilih cuplikan yang disorot

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.
- Pilih Sisipkan Cuplikan diikuti dengan Cuplikan Kode Saya.
- Pilih cuplikan yang relevan dari daftar, dengan mengkliknya.

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

Pilih cuplikan yang relevan dari daftar, dengan mengkliknya