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. publicclassUserInfo
  2. {
  3. publicintID{get;set;}
  4. publicstringUserName{get;set;}
  5. publicintAge{get;set;}
  6. }

2、定义Controller

  1. using MVC5DependencyInjection.Abstract;
  2. usingSystem;
  3. usingSystem.Collections.Generic;
  4. usingSystem.linq;
  5. usingSystem.Web;
  6. usingSystem.Web.Mvc;
  7. namespace MVC5DependencyInjection.Controllers
  8. {
  9. publicclassUserController:Controller
  10. {
  11. privateIUserservice;
  12. publicUserController(IUserservice)
  13. {
  14. this.service=service;
  15. }
  16. publicActionResultIndex()
  17. {
  18. vardata=this.service.GetUsers();
  19. returnView(data);
  20. }
  21. }
  22. }

3、定义UserController 的Index的视图

  1. @modelList<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. publicinterfaceIUser
  4. {
  5. List<UserInfo>GetUsers();
  6. }
  7. }

5、定义接口IUser一个实现类SimpleUser

  1. namespace MVC5DependencyInjection.Concrete
  2. {
  3. publicclassSimpleUser:IUser
  4. {
  5. publicList<UserInfo>GetUsers()
  6. {
  7. varlist=newList<UserInfo>();
  8. for(inti=0;i<10;i++)
  9. {
  10. list.Add(newUserInfo(){ID=i,UserName="Uer"+i,Age=i});
  11. }
  12. returnlist;
  13. }
  14. }
  15. }

6、使用nuget为项目增加Unity相关的包

选中mvc的那个项目右键“管理NuGet 程序包”在弹出的窗口中输入Unity搜索,在结果选中Unity.MVC4点击安装。


这里只有MVC4的Unity但是MVC5一样的用,不影响。

7、注册依赖使用依赖注入生效

  1. usingMicrosoft.Practices.Unity;
  2. using MVC5DependencyInjection.Abstract;
  3. using MVC5DependencyInjection.Concrete;
  4. usingSystem.Web.Mvc;
  5. usingSystem.Web.Optimization;
  6. usingSystem.Web.Routing;
  7. usingUnity.Mvc4;
  8. namespace MVC5DependencyInjection
  9. {
  10. publicclassMvcApplication:System.Web.HttpApplication
  11. {
  12. protectedvoidApplication_Start()
  13. {
  14. AreaRegistration.RegisterAllAreas();
  15. FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  16. RouteConfig.RegisterRoutes(RouteTable.Routes);
  17. BundleConfig.RegisterBundles(BundleTable.Bundles);
  18. //注入 Ioc
  19. varcontainer=this.BuildUnityContainer();
  20. DependencyResolver.SetResolver(newUnityDependencyResolver(container));
  21. }
  22. IUnityContainerBuildUnityContainer()
  23. {
  24. varcontainer=newUnityContainer();
  25. container.RegisterType<IUser,SimpleUser>();
  26. returncontainer;
  27. }
  28. }
  29. }
对照你的项目的Global.asax在里面加入上面的注入IoC相关的代码,上面的代码是最核心的,要使依赖注入生效必须要上面的代码。


最终运行的结果为: