在ASP.NET MVC中使用Unity进行依赖注入的三种方式

时间:2023-02-16 23:41:24

在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进行依赖注入的三种方式的更多相关文章

  1. ASP&period;NET MVC中使用Unity进行依赖注入的三种方式

    在ASP.NET MVC中使用Unity进行依赖注入的三种方式 2013-12-15 21:07 by 小白哥哥, 146 阅读, 0 评论, 收藏, 编辑 在ASP.NET MVC4中,为了在解开C ...

  2. Asp&period;net MVC 中使用 Ninject 实现依赖注入

    松耦合.针对抽象编程.不针对实现编程是面向对象设计的原则.依赖注入就是,在一个类的内部,不通过创建对象的实例而能够获得实现了某个公开接口的对象引用.所谓的控制反转也是相同的意思.把依赖的创建转移到了使 ...

  3. ASP&period;NET MVC2中Controller向View传递数据的三种方式

    转自:http://www.cnblogs.com/zhuqil/archive/2010/08/03/Passing-Data-from-Controllers-to-View.html 在Asp. ...

  4. 在 mvc 4 中使用 unity 进行依赖注入

    在 mvc 4 中使用 unity 进行依赖注入 关于依赖注入的概念,这里就不再叙述了,我们用 mvc 4 结合 unity,使用构造函数来进行依 赖注入.具体步骤如下: 1. 首先建立 一个 mvc ...

  5. ASP&period;NET MVC中使用Unity Ioc Container

    写在前面 安装Unity 添加服务层 IArticleRepository类型映射 服务注入到控制器 Global.asax初始化 后记 关于Unity的使用可以参照<Unity依赖注入使用详解 ...

  6. ASP&period;NET MVC中实现多个按钮提交的几种方法

    有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...

  7. 【MVC】ASP&period;NET MVC中实现多个按钮提交的几种方法

    有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...

  8. &lbrack;转&rsqb;ASP&period;NET MVC中实现多个按钮提交的几种方法

    本文转自:http://www.cnblogs.com/wuchang/archive/2010/01/29/1658916.html 有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能, ...

  9. ASP&period;NET MVC中实现多个button提交的几种方法

    有时候会遇到这样的情况:在一个表单上须要多个button来完毕不同的功能,比方一个简单的审批功能. 假设是用webform那不须要讨论,但asp.net mvc中一个表单仅仅能提交到一个Action处 ...

随机推荐

  1. Understanding Service Types

    Last update: June 2014. I have partially rewritten this article to provide more technical details an ...

  2. ios学习笔记block回调的应用(一个简单的例子)

    一.什么是Blocks      Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block. 二. ...

  3. C&plus;&plus;实现RTMP协议发送H&period;264编码及AAC编码的音视频

    http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html C++实现RTMP协议发送H.264编码及AAC编码的音视频 RTMP ...

  4. Servlet&lpar;2&rpar;

    一.伪代码演示Tomcat的内部代码运行 1).通过映射找到servlet-class的内容,字符串:com.gqx.servlet.FirstServlet 2).通过反射构造构造FirstServ ...

  5. sqlplus 链接数据库

    实验目的:在虚拟机中用sqlplus工具访问真实机的数据库: 实验环境: 真实机(windows系统,数据库服务名 orcl): SQL> select * from v$version; BA ...

  6. MyBatis源码解析(五)——DataSource数据源模块之非池型数据源

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6675633.html 1 回顾 上一篇中我解说了数据源接口DataSource与数据源工厂 ...

  7. ORA-19602&colon; cannot backup or copy active file in NOARCHIVELOG mode

    备份数据库,报错如下 RMAN> backup database; Starting backup at -JAN- allocated channel: ORA_DISK_1 channel ...

  8. jQuery实现商品详情 详细参数页面切换

    利用index实现: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  9. 大家一起做训练 第一场 G CD

    题目来源:UVA 624 题目的意思就是:我现在需要从 t 张CD中拿出一部分来,尽可能的凑出接近 N 这么久的音乐,但是不能超过 N. CD不超过20张,每张长度不超过 N ,不能重复选. 一个很简 ...

  10. ORA-06502&colon; PL&sol;SQL&colon; 数字或值错误 &colon; 字符串缓冲区太小解决办法

    1.今天写的存储过程在执行过程中,报如下错误. exec PRO_T_008pro_update_add_delete(17,1,1,1,1,45.0,54.0,45.0,45.0,45.0,54.0 ...