在ASP.NET MVC中使用Unity进行依赖注入的三种方式
在ASP.NET MVC4中,为了在解开Controller和Model的耦合,我们通常需要在Controller激活系统中引入IoC,用于处理用户请求的 Controller,让Controller依赖于ModelRepository的抽象而不是它的实现。
我们可以在三个阶段使用IoC实现上面所说的解耦操作,首先需要简单介绍一下默认情况下Controller的激活过程:
1、用户发送请求黑ASP.NET,路由系统对请求进行解析,根据注册的路由规则对请求进行匹配,解析出Controller和Action的名称等信息。
2、将解析出的信息交给一个MvcRouteHandler对象进行处理,MvcHttpHandler中存在以个ControllerFactory成员,如果构造函数中没有提供一个实现IControllerFactory接口的对象,则默认构造函数通过调用ControllerBuilder.Current.GetControllerFactory()获取一个这样的对象。
3、系统调用上文对象中德GetHttpHandler获得了一个实现了IHttpHandler接口的MvcHandler对象最终处理请求。
4、在 MvcHandler中调用BeginProcessRequest方法继续处理请求,方法中从1中解析的信息中获得Controller和Action 的信息,而后利用2种的IControllerFactory对象激活Controller对象,并最终执行相应的Action。
第一种方法
由上文2种可知,我们可以创建自己的IControllerFactory对象实现依赖注入,然而我们可以通过直接继承 DefaultControllerFactory并重写GetControllerInstance方法来实现,这样可以免去重新实现其他一些功能的工作。
以下是使用Unity创建的继承自DefaultControllerFactory的UnityControllerFactory的简单示例:
namespace UnitySample
{
public class UnityControllerFactory:DefaultControllerFactory
{
private IUnityContainer container;
public UnityControllerFactory(IUnityContainer container)
{
this.container = container;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return null == controllerType ? null : (IController)this.container.Resolve(controllerType);
//return base.GetControllerInstance(requestContext, controllerType);
}
}
}
我们可以在App_Start中使用ControllerBuilder设置系统使用这个ControllerFactory
IUnityContainer container = new UnityContainer(); container.RegisterType(); UnityControllerFactory factory = new UnityControllerFactory(container); ControllerBuilder.Current.SetControllerFactory(factory);
第二种方法
上文中继承的DefaultControllerFactory中,使用一个ControllerActivator的成员来实现对 Controller的激活,如果创建对象中没有提供一个IControllerActivator对象,则提供一个默认实现了 IControllerActivator的DefaultControllerActivator对象这个类型,这个接口中存在用于创建 Controller对象的Create方法,在DefaultControllerFactory中有存在一个 IControllerActivator类型的构造方法来制定它。所以我们可以使用一个自定义的实现自IControllerActivator借口的对象来进行依赖注入。
namespace UnitySample
{
public class UnityControllerActivator:IControllerActivator
{
private IUnityContainer container;
public UnityControllerActivator(IUnityContainer container)
{
this.container = container;
}
public IController Create(RequestContext requestContext, Type controllerType)
{
return controllerType == null ? null : (IController)container.RegisterType(controllerType);
}
}
}
修改方法1中在App_Start中的代码,使用这个ControllerActivator:
IUnityContainer container = new UnityContainer(); container.RegisterType(); //UnityControllerFactory factory = new UnityControllerFactory(container); IControllerActivator controllerActivator = new UnityControllerActivator(container); DefaultControllerFactory defaultFactory = new DefaultControllerFactory(controllerActivator); ControllerBuilder.Current.SetControllerFactory(defaultFactory);
第三种方法
如同DefaultControllerFactory类中一样,在DefaultControllerActivator中也存在一个包含一个参数(类型为IDependencyResolver)的构造方法和一个没有参数的构造方法,默认情况下DefaultControlerFactory使用无参构造函数实例化一个DefaultControllerActivator对象,这种情况下提供一个默认的IDependencyResolver 对象。所以我们就同样可以使用一个自定义的IDependencyResolver类实现依赖注入。在IDependencyResolver接口中存在方法GetService和GetServices来对具体的类型进行解析
namespace UnitySample
{
public class UnityDependencyResolver:IDependencyResolver
{
private IUnityContainer container;
public UnityDependencyResolver(IUnityContainer container)
{
this.container = container;
}
public object GetService(Type serviceType)
{
return container.Resolve(serviceType);
}
public IEnumerable<object>GetServices(Type serviceType)
{
return container.ResolveAll(serviceType);
}
}
}
修改App_Strat中的方法,使用这个自定义的DependencyResolver:
IUnityContainer container=new UnityContainer(); container.Register Type<IXXXRepository,XXXRepository>(); UnityDependencyResolver resolver=new UnityDependencyResolver(container); DependencyResolver.SetResolver(resolver)
在ASP.NET MVC中使用Unity进行依赖注入的三种方式的更多相关文章
- ASP.NET MVC中使用Unity进行依赖注入的三种方式
在ASP.NET MVC中使用Unity进行依赖注入的三种方式 2013-12-15 21:07 by 小白哥哥, 146 阅读, 0 评论, 收藏, 编辑 在ASP.NET MVC4中,为了在解开C ...
- Asp.net MVC 中使用 Ninject 实现依赖注入
松耦合.针对抽象编程.不针对实现编程是面向对象设计的原则.依赖注入就是,在一个类的内部,不通过创建对象的实例而能够获得实现了某个公开接口的对象引用.所谓的控制反转也是相同的意思.把依赖的创建转移到了使 ...
- ASP.NET MVC2中Controller向View传递数据的三种方式
转自:http://www.cnblogs.com/zhuqil/archive/2010/08/03/Passing-Data-from-Controllers-to-View.html 在Asp. ...
- 在 mvc 4 中使用 unity 进行依赖注入
在 mvc 4 中使用 unity 进行依赖注入 关于依赖注入的概念,这里就不再叙述了,我们用 mvc 4 结合 unity,使用构造函数来进行依 赖注入.具体步骤如下: 1. 首先建立 一个 mvc ...
- ASP.NET MVC中使用Unity Ioc Container
写在前面 安装Unity 添加服务层 IArticleRepository类型映射 服务注入到控制器 Global.asax初始化 后记 关于Unity的使用可以参照<Unity依赖注入使用详解 ...
- ASP.NET MVC中实现多个按钮提交的几种方法
有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...
- 【MVC】ASP.NET MVC中实现多个按钮提交的几种方法
有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...
- [转]ASP.NET MVC中实现多个按钮提交的几种方法
本文转自:http://www.cnblogs.com/wuchang/archive/2010/01/29/1658916.html 有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能, ...
- ASP.NET MVC中实现多个button提交的几种方法
有时候会遇到这样的情况:在一个表单上须要多个button来完毕不同的功能,比方一个简单的审批功能. 假设是用webform那不须要讨论,但asp.net mvc中一个表单仅仅能提交到一个Action处 ...
随机推荐
- Spring MVC处理异常的4种方式
http://blog.csdn.net/ufo2910628/article/details/40399539 http://my.oschina.net/CandyDesire/blog/3333 ...
- bootstrap源码分析之tab(选项卡)
实现tab选项卡的应用,此插件相对比较简单 源码文件: tab.js 实现原理 1.单击一个元素时,首先将原来高亮的元素取消2.然后给被单击元素进行高亮3.如果单击元素是下拉框中某个选项,则选中本身, ...
- MixItUp:超炫!基于 CSS3 & jQuery 的过滤和排序插件
MixItUp 是一款轻量,但功能强大的 jQuery 插件,提供了对分类和有序内容的美丽的动画过滤和排序功能.特别适合用于作品集网站,画廊,图片博客以及任何的分类或有序内容. 它是如何工作的? Mi ...
- Junit单元测试笔记
什么是单元测试? 单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明确的功能是否正确. 单元测试目的? 执行单元测试,是为了证明某段代码的行为确实和开发者所期望的一致. 白盒测试和单 ...
- C#遍历得到checkboxlist选中值和设置选中项
得到选中项的value值并拼接成一个字符串返回 public string GetChecked(CheckBoxList checkList, string separator) { string ...
- SharePoint 2013 场解决方案包含第三方程序集
前言 当我们使用SharePoint 场解决方案的时候,经常会包含第三方的程序集,而第三方的程序集经常会有强签名的问题,如果有强签名可以部署到GAC,没有的话也可以部署到应用程序下. 那么,很多初学者 ...
- ORACLE -- ArcSDE Lock request conflicts with an established lock【转】
具体的解决办法有如下三种 1.多半情况下关闭数据库连接可以解决这个问题,但有时候问题依然存在. 2. >1.关闭所有的ArcMap和ArcCatalog session. >2.开始——运 ...
- [Android]AndroidBucket增加碎片SubLayout功能及AISubLayout的注解支持
以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3709957.html 之前写过一篇博客,是使用Fragment来实现T ...
- Android 采用Layout Inflater创建一个View对象
接着上文<Android ListViewview入门>,本文使用android的Inflater来实现 在layouyt文件夹中新建一个list_item.xml的文件,添加如下代码: ...
- Eclipse为成员变量设置前缀
Eclipse可以自动生成getter和setter,constructor. 菜单 - Source, 有Generate Getters and Setter,Generate Construct ...