我之前写的文章一般都有通过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;
}
}
}
对照你的项目的Global.asax在里面加入上面的注入IoC相关的代码,上面的代码是最核心的,要使依赖注入生效必须要上面的代码。
最终运行的结果为: