ASP.NET MVC中使用Unity Ioc Container
2014-04-22 09:12
483 查看
写在前面
安装Unity添加服务层
IArticleRepository类型映射
服务注入到控制器
Global.asax初始化
后记
关于Unity的使用可以参照《Unity依赖注入使用详解》,依赖注入的概念参照《小菜学习设计模式(五)—控制反转(Ioc)》。
在MVC中,控制器依赖于模型对数据进行处理,也可以说执行业务逻辑。我们可以使用依赖注入(DI)在控制层分离模型层,这边要用到Repository模式,在领域驱动设计(DDD)中,Repository翻译为仓储,顾名思义,就是储存东西的仓库,可以理解为一种用来封装存储,读取和查找行为的机制,它模拟了一个对象集合。使用依赖注入(DI)就是对Repository进行管理,用于解决它与控制器之间耦合度问题,下面我们一步一步做一个简单示例。
安装Unity
首先我们需要新建一个UnityMVCDemo项目(ASP.NET MVC4.0),选择工具-库程序包管理器-程序包管理控制台,输入“Install-Package Unity.Mvc4”命令,VS2010可能需要先安装NuGet。![](http://images.cnitblog.com/i/435188/201404/211454087161325.jpg)
或者通过工具-库程序包管理器-管理解决方案的 NuGet 程序包,通过联机搜索“Unity.Mvc4”进行安装。
![](http://images.cnitblog.com/i/435188/201404/211505582792682.jpg)
在安装过程中可能会遇到下面这样错误:
![](http://images.cnitblog.com/i/435188/201404/211506398417752.jpg)
根据异常信息,可以肯定是项目的.net framework版本无法安装Unity,这种安装VS会自动搜索Unity最新版本,但是最新版本往往有. net framework版本要求,不知道有没有指定Unity版本安装,可以看到我们安装的是Unity3.0版本,修改一下项目. net framework的版本为4.5,重新安装就可以了。
安装Unity成功后,我们发现项目中多了“Microsoft.Practices.Unity”和“Microsoft.Practices.Unity.Configuration”两个引用,还有一个Bootstrapper类文件,Bootstrapper翻译为引导程序,也就是Ioc容器。
public static class Bootstrapper { public static IUnityContainer Initialise() { var container = BuildUnityContainer(); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); return container; } private static IUnityContainer BuildUnityContainer() { var container = new UnityContainer(); // register all your components with the container here // it is NOT necessary to register your controllers // e.g. container.RegisterType<ITestService, TestService>(); RegisterTypes(container); return container; } public static void RegisterTypes(IUnityContainer container) { } }
添加服务层
首先我们添加一个Article实体类:/// <summary> /// Article实体类 /// </summary> public class Article { public int Id { get; set; } public string Title { get; set; } public string Author { get; set; } public string Content { get; set; } public DateTime CreateTime { get; set; } }
一般Repository都有一些相似的操作,比如增删改查,我们可以把它抽象为IArticleRepository接口,这样控制器依赖于抽象接口,而不依赖于具体实现Repository类,符合依赖倒置原则,我们才可以使用Unity进行依赖注入。
/// <summary> /// IArticleRepository接口 /// </summary> public interface IArticleRepository { IEnumerable<Article> GetAll(); Article Get(int id); Article Add(Article item); bool Update(Article item); bool Delete(int id); }
创建ArticleRepository,依赖于IArticleRepository接口,实现基本操作。
public class ArticleRepository : IArticleRepository { private List<Article> Articles = new List<Article>(); public ArticleRepository() { //添加演示数据 Add(new Article { Id = 1, Title = "UnityMVCDemo1", Content = "UnityMVCDemo", Author = "xishuai", CreateTime = DateTime.Now }); Add(new Article { Id = 2, Title = "UnityMVCDemo2", Content = "UnityMVCDemo", Author = "xishuai", CreateTime = DateTime.Now }); Add(new Article { Id = 3, Title = "UnityMVCDemo2", Content = "UnityMVCDemo", Author = "xishuai", CreateTime = DateTime.Now }); } /// <summary> /// 获取全部文章 /// </summary> /// <returns></returns> public IEnumerable GetAll() { return Articles; } /// <summary> /// 通过ID获取文章 /// </summary> /// <param name="id"></param> /// <returns></returns> public Article Get(int id) { return Articles.Find(p => p.Id == id); } /// <summary> /// 添加文章 /// </summary> /// <param name="item"></param> /// <returns></returns> public Article Add(Article item) { if (item == null) { throw new ArgumentNullException("item"); } Articles.Add(item); return item; } /// <summary> /// 更新文章 /// </summary> /// <param name="item"></param> /// <returns></returns> public bool Update(Article item) { if (item == null) { throw new ArgumentNullException("item"); } int index = Articles.FindIndex(p => p.Id == item.Id); if (index == -1) { return false; } Articles.RemoveAt(index); Articles.Add(item); return true; } /// <summary> /// 删除文章 /// </summary> /// <param name="id"></param> /// <returns></returns> public bool Delete(int id) { Articles.RemoveAll(p => p.Id == id); return true; } }
IArticleRepository类型映射
上面工作做好后,我们需要在Bootstrapper中的BuildUnityContainer方法添加此类型映射。private static IUnityContainer BuildUnityContainer() { var container = new UnityContainer(); // register all your components with the container here // it is NOT necessary to register your controllers container.RegisterType<IArticleRepository, ArticleRepository>(); // e.g. container.RegisterType<ITestService, TestService>(); RegisterTypes(container); return container; }
我们还可以在配置文件中添加类型映射,UnityContainer根据配置信息,自动注册相关类型,这样我们就只要改配置文件了,当然推荐是这种方法,配置文件:
<configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" /> </configSections> <unity> <containers> <container name="defaultContainer"> <register type="UnityMVCDemo.Models.IArticleRepository, UnityMVCDemo" mapTo="UnityMVCDemo.Models.ArticleRepository, UnityMVCDemo"/> </container> </containers> </unity>
注意configSections节点要放在configuration节点下的第一个节点,关于Unity的配置文件配置参照/article/4743804.html,加载配置文件代码:
UnityConfigurationSection configuration = (UnityConfigurationSection)ConfigurationManager.GetSection(UnityConfigurationSection.SectionName); configuration.Configure(container, "defaultContainer");
上面这段代码替换掉上面使用的RegisterType方法。
服务注入到控制器
在ArticleController中我们使用是构造器注入方式,当然还有属性注入和方法注入,可以看到ArticleController依赖于抽象IArticleRepository接口,而并不是依赖于ArticleRepository具体实现类。public class ArticleController : Controller { readonly IArticleRepository repository; //构造器注入 public ArticleController(IArticleRepository repository) { this.repository = repository; } public ActionResult Index() { var data = repository.GetAll(); return View(data); } }
Global.asax初始化
做完上面的工作后,我们需要在Global.asax中的Application_Start方法添加依赖注入初始化。// Note: For instructions on enabling IIS6 or IIS7 classic mode, // visit http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); Bootstrapper.Initialise(); } }
后记
示例代码下载:http://pan.baidu.com/s/1qWoCy9e。如果你觉得本篇文章对你有所帮助,请点击右下部“推荐”,^_^
相关文章推荐
- ASP.NET MVC中使用Unity Ioc Container
- ASP.NET MVC中使用Unity Ioc Container
- ASP.NET MVC如何使用Unity实现Ioc详解
- 使用Spring.Net 1.3.2实现Container(IoC)(二)ASP.NET MVC、ControllerFactory
- Asp.Net MVC 体验 4 Unity使用
- 在ASP.NET MVC中使用Unity进行依赖注入的三种方式
- Asp.net MVC 使用Autofac的简单使用 IOC
- ASP.NET MVC IOC之Unity攻略
- Asp.net MVC 使用Autofac的简单使用 IOC
- ASP.NET MVC使用IoC
- MVC中使用Unity Ioc Container
- 在ASP.NET MVC中使用Unity进行依赖注入的三种方式
- ASP.NET MVC中使用Unity进行依赖注入的三种方式
- 【转载】使用Json比用string返回数据更友好,也更面向对象一些 |Asp.net MVC 2.0 + Unity 2.0(IoC) + EF4.0 实例:RoRoWoBlog 开源项目框架代码
- ASP.NET MVC中的依赖倒置IOC/依赖注入DI, (MircroSoft.Practices.Unity)与asp.net mvc 3的融合
- ASP.NET MVC IOC之Unity攻略
- Asp.net mvc使用unity
- ASP.NET MVC中使用Spring.Net实现IOC和DI
- (转)Asp.Net MVC 体验 4 Unity使用
- 在ASP.NET MVC中使用Unity进行依赖注入的三种方式