我之前寫的文章一般都有通過Autofac來實現IoC,這次我來換一個框架,體會一下ASP.NET mvc5 採用Unity依賴注入Controller。此之前說說一下Unity框架。
Unity是微軟Patterns & Practices團隊所開發的一個輕量級的,並且可擴展的依賴注入(Dependency Injection)容器,它支持常用的三種依賴注入方式:構造器注入(Constructor Injection)、屬性注入(Property Injection),以及方法調用注入(Method Call Injection).現在Unity最新的版本的1.2版,可以在微軟的開源站點http://unity.codeplex.com下載最新的發佈版 本和文檔。通過使用Unity,我們能輕鬆構建鬆耦合結構的程序,從而讓整個程序框架變得清晰和易於維護。
下面我通過一個具體的mvc的例子來說明一下怎麼用。這個例子是簡單的列表展示,爲了讓例子簡單我這這裏就沒用數據庫,數據直接寫死了。
1、定義展示數據的model類
- public class UserInfo
- {
- public int ID { get; set; }
- public string UserName { get; set; }
- public int Age { get; set; }
- }
2、定義Controller
- using MVC5DependencyInjection.Abstract;
- using System;
- using System.Collections.Generic;
- using System.linq;
- using System.Web;
- using System.Web.Mvc;
- namespace MVC5DependencyInjection.Controllers
- {
- public class UserController : Controller
- {
- private IUser service;
- public UserController(IUser service)
- {
- this.service = service;
- }
- public ActionResult Index()
- {
- var data = this.service.GetUsers();
- return View(data);
- }
- }
- }
3、定義UserController 的Index的視圖
- @model List<MVC5DependencyInjection.Models.UserInfo>
- @{
- ViewBag.Title = "Index";
- }
- <h2>Index</h2>
- <table class="table">
- <tr>
- <th>ID</th>
- <th>UserName</th>
- <th>Age</th>
- </tr>
- @foreach (var item in Model)
- {
- <tr>
- <td>@item.ID</td>
- <td>@item.UserName</td>
- <td>@item.Age</td>
- </tr>
- }
- </table>
4、定義UserController用到的數據訪問接口IUser
- namespace MVC5DependencyInjection.Abstract
- {
- public interface IUser
- {
- List<UserInfo> GetUsers();
- }
- }
5、定義接口IUser一個實現類SimpleUser
- namespace MVC5DependencyInjection.Concrete
- {
- public class SimpleUser:IUser
- {
- public List<UserInfo> GetUsers()
- {
- var list = new List<UserInfo>();
- for (int i = 0; i < 10; i++)
- {
- list.Add(new UserInfo() { ID = i, UserName = "Uer"+i, Age = i });
- }
- return list;
- }
- }
- }
6、使用nuget爲項目增加Unity相關的包
選中mvc的那個項目右鍵“管理NuGet 程序包”在彈出的窗口中輸入Unity搜索,在結果選中Unity.MVC4點擊安裝。
這裏只有MVC4的Unity但是MVC5一樣的用,不影響。
7、註冊依賴使用依賴注入生效
- using Microsoft.Practices.Unity;
- using MVC5DependencyInjection.Abstract;
- using MVC5DependencyInjection.Concrete;
- using System.Web.Mvc;
- using System.Web.Optimization;
- using System.Web.Routing;
- using Unity.Mvc4;
- namespace MVC5DependencyInjection
- {
- public class MvcApplication : System.Web.HttpApplication
- {
- protected void Application_Start()
- {
- AreaRegistration.RegisterAllAreas();
- FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
- RouteConfig.RegisterRoutes(RouteTable.Routes);
- BundleConfig.RegisterBundles(BundleTable.Bundles);
- //注入 Ioc
- var container = this.BuildUnityContainer();
- DependencyResolver.SetResolver(new UnityDependencyResolver(container));
- }
- IUnityContainer BuildUnityContainer()
- {
- var container = new UnityContainer();
- container.RegisterType<IUser, SimpleUser>();
- return container;
- }
- }
- }
最終運行的結果爲: