我之前写的文章一般都有通过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类
- publicclassUserInfo
- {
- publicintID{get;set;}
- publicstringUserName{get;set;}
- publicintAge{get;set;}
- }
2、定义Controller
- using MVC5DependencyInjection.Abstract;
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.linq;
- usingSystem.Web;
- usingSystem.Web.Mvc;
- namespace MVC5DependencyInjection.Controllers
- {
- publicclassUserController:Controller
- {
- privateIUserservice;
- publicUserController(IUserservice)
- {
- this.service=service;
- }
- publicActionResultIndex()
- {
- vardata=this.service.GetUsers();
- returnView(data);
- }
- }
- }
3、定义UserController 的Index的视图
- @modelList<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
- {
- publicinterfaceIUser
- {
- List<UserInfo>GetUsers();
- }
- }
5、定义接口IUser一个实现类SimpleUser
- namespace MVC5DependencyInjection.Concrete
- {
- publicclassSimpleUser:IUser
- {
- publicList<UserInfo>GetUsers()
- {
- varlist=newList<UserInfo>();
- for(inti=0;i<10;i++)
- {
- list.Add(newUserInfo(){ID=i,UserName="Uer"+i,Age=i});
- }
- returnlist;
- }
- }
- }
6、使用nuget为项目增加Unity相关的包
选中mvc的那个项目右键“管理NuGet 程序包”在弹出的窗口中输入Unity搜索,在结果选中Unity.MVC4点击安装。
这里只有MVC4的Unity但是MVC5一样的用,不影响。
7、注册依赖使用依赖注入生效
- usingMicrosoft.Practices.Unity;
- using MVC5DependencyInjection.Abstract;
- using MVC5DependencyInjection.Concrete;
- usingSystem.Web.Mvc;
- usingSystem.Web.Optimization;
- usingSystem.Web.Routing;
- usingUnity.Mvc4;
- namespace MVC5DependencyInjection
- {
- publicclassMvcApplication:System.Web.HttpApplication
- {
- protectedvoidApplication_Start()
- {
- AreaRegistration.RegisterAllAreas();
- FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
- RouteConfig.RegisterRoutes(RouteTable.Routes);
- BundleConfig.RegisterBundles(BundleTable.Bundles);
- //注入 Ioc
- varcontainer=this.BuildUnityContainer();
- DependencyResolver.SetResolver(newUnityDependencyResolver(container));
- }
- IUnityContainerBuildUnityContainer()
- {
- varcontainer=newUnityContainer();
- container.RegisterType<IUser,SimpleUser>();
- returncontainer;
- }
- }
- }
最终运行的结果为: