IoC實踐--ASP.NET MVC5 採用Unity依賴注入Controller詳解

我之前寫的文章一般都有通過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類

  1. public class UserInfo
  2. {
  3. public int ID { get; set; }
  4. public string UserName { get; set; }
  5. public int Age { get; set; }
  6. }

2、定義Controller

  1. using MVC5DependencyInjection.Abstract;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.linq;
  5. using System.Web;
  6. using System.Web.Mvc;
  7. namespace MVC5DependencyInjection.Controllers
  8. {
  9. public class UserController : Controller
  10. {
  11. private IUser service;
  12. public UserController(IUser service)
  13. {
  14. this.service = service;
  15. }
  16. public ActionResult Index()
  17. {
  18. var data = this.service.GetUsers();
  19. return View(data);
  20. }
  21. }
  22. }

3、定義UserController 的Index的視圖

  1. @model List<MVC5DependencyInjection.Models.UserInfo>
  2. @{
  3. ViewBag.Title = "Index";
  4. }
  5. <h2>Index</h2>
  6. <table class="table">
  7. <tr>
  8. <th>ID</th>
  9. <th>UserName</th>
  10. <th>Age</th>
  11. </tr>
  12. @foreach (var item in Model)
  13. {
  14. <tr>
  15. <td>@item.ID</td>
  16. <td>@item.UserName</td>
  17. <td>@item.Age</td>
  18. </tr>
  19. }
  20. </table>

4、定義UserController用到的數據訪問接口IUser

  1. namespace MVC5DependencyInjection.Abstract
  2. {
  3. public interface IUser
  4. {
  5. List<UserInfo> GetUsers();
  6. }
  7. }

5、定義接口IUser一個實現類SimpleUser

  1. namespace MVC5DependencyInjection.Concrete
  2. {
  3. public class SimpleUser:IUser
  4. {
  5. public List<UserInfo> GetUsers()
  6. {
  7. var list = new List<UserInfo>();
  8. for (int i = 0; i < 10; i++)
  9. {
  10. list.Add(new UserInfo() { ID = i, UserName = "Uer"+i, Age = i });
  11. }
  12. return list;
  13. }
  14. }
  15. }

6、使用nuget爲項目增加Unity相關的包

選中mvc的那個項目右鍵“管理NuGet 程序包”在彈出的窗口中輸入Unity搜索,在結果選中Unity.MVC4點擊安裝。


這裏只有MVC4的Unity但是MVC5一樣的用,不影響。

7、註冊依賴使用依賴注入生效

  1. using Microsoft.Practices.Unity;
  2. using MVC5DependencyInjection.Abstract;
  3. using MVC5DependencyInjection.Concrete;
  4. using System.Web.Mvc;
  5. using System.Web.Optimization;
  6. using System.Web.Routing;
  7. using Unity.Mvc4;
  8. namespace MVC5DependencyInjection
  9. {
  10. public class MvcApplication : System.Web.HttpApplication
  11. {
  12. protected void Application_Start()
  13. {
  14. AreaRegistration.RegisterAllAreas();
  15. FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  16. RouteConfig.RegisterRoutes(RouteTable.Routes);
  17. BundleConfig.RegisterBundles(BundleTable.Bundles);
  18. //注入 Ioc
  19. var container = this.BuildUnityContainer();
  20. DependencyResolver.SetResolver(new UnityDependencyResolver(container));
  21. }
  22. IUnityContainer BuildUnityContainer()
  23. {
  24. var container = new UnityContainer();
  25. container.RegisterType<IUser, SimpleUser>();
  26. return container;
  27. }
  28. }
  29. }
對照你的項目的Global.asax在裏面加入上面的注入IoC相關的代碼,上面的代碼是最核心的,要使依賴注入生效必須要上面的代碼。


最終運行的結果爲:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章