上一篇文章主要以文字的形式介绍了IoC及其在ASP.NET MVC中的使用,本章将从以下几点介绍如何使用代码在ASP.NET MVC中实现依赖注入:
  ● AutoFac及安装
  ● 容器的创建
  ● 创建基于AutoFac的DependencyResolver
  ● 创建基于AutoFac的ControllerFactory

AutoFac及安装

  Autofac是一个基于.Net的IoC容器,它用来管理类与类之间的依赖。Autofac提供了多种方法来将一个类型注册到容器中,也提供了构造注入、属性注入和方法注入等多种方式将依赖注入到实例中。
  本例将使用autofac作为依赖注入容器来实现ASP.NET MVC中的依赖注入功能。
  1. 通过Nuget在MyBlog项目下安装Autofac组件:

  

容器的创建

  1. 创建前的准备:
  将PostController依赖的BlogManager修改为通过构造方法传入:

  

  2. 创建一个新的静态类型MyBlogContainer以及静态方法GetContainer来创建一个容器,并将BlogManager和PostController放入容器中:

  

  

基于AutoFac的DependencyResolver

  ASP.NET MVC中的DependencyResolver不仅用于Controller的创建,而且在Controller也可以用它来从容器中获取组件。现在就创建一个自定义的DependencyResolver并替换默认的,使ASP.NET MVC能够从容器中获取之前放入容器的BlogManager以及PostController。
  1. 创建一个自定义的DependencyResolver:

  

  注:加入异常获取是因为不是所有的组件都被注册到容器中,当容器获取不存在的组件时就回抛出异常,这里如果没有找到组件就返回null,程序会调用其它方式去实例化组件,如使用 Activator.CreateInstance方法。
  2. 在Application_Start方法中调用容器的创建及解析器的替换:

  

  3. 运行程序,在文章列表页的断点中manager是可用的,证明Controller的有参构造已经成功调用:

  

  

创建基于AutoFac的ControllerFactory

  ASP.NET MVC的Controller Factory前面的文章介绍过是用来创建Controller的,而ASP.NET MVC中有一个默认的控制器工厂类型DefaultControllerFactory。它创建Controller有两个主要步骤分别是Controller的类型获取(有缓存机制)以及Controller的创建(通过IControllerActivator)。
要让ControllerFactory在创建Controller时从IoC容器获取那么只需要替换它的创建方法即可,也就是说要么替换IControllerActivator要么直接跳过IControllerActivator直接从容器创建,由于两种方法实现类似,所以本例仅实现跳过IControllerActivator的版本:
  1. 继承DefaultControllerFactory自定义新的ControllerFactory(由于还需要使用到Controller类型获取的环节,所以直接继承最为方便),重载受保护的GetControllerInstance即可,另外如果容器中找不到相应的Controller在继续调用基类的创建方法是为了保证其它没有注册到容器的Controller也能正确被创建:

  

  2. 在Application_Start方法中替换控制器工厂:

  

  3. 运行程序,程序同样能够正常工作:

  

  注:因为PostController被删除了无参构造方法,并且manager实例也需要在构造方法中赋值,所以如果不使用容器来创建Controller是会出错的如下:

  

  

小结

  本文使用AutoFac实现了ASP.NET MVC中基于Dependency Resolver和基于ControllerFactory两种方式的依赖注入,用代码的形式验证了之前文章的分析。但需要注意的是以上代码仅仅是实验用的Demo,Autofac是一个相对复杂的IoC容器,要使用好它可以参考官方文档http://autofac.readthedocs.io/en/latest/getting-started/index.html 或等待后续文章介绍。
  关于ASP.NET MVC的两种依赖注入拓展方式并没有好坏之分,拓展方式的选择更多的是依赖实际情况来选择。

  另外本文虽然实现了依赖注入,当实际上没有使用依赖倒置原则DIP,换句话说PostController仍然依赖的是BlogManager这个实现,这样做是不合理的,关于MyBlog的代码会在后续文章中介绍如何重构。

参考:
  http://autofac.readthedocs.io/en/latest/getting-started/index.html

本文连接:http://www.cnblogs.com/selimsong/p/7698663.html

ASP.NET没有魔法——目录

ASP.NET没有魔法——ASP.NET MVC IoC代码篇的更多相关文章

  1. ASP.NET没有魔法——ASP.NET MVC IoC

    之前的文章介绍了MVC如何通过ControllerFactory及ControllerActivator创建Controller,而Controller又是如何通过ControllerBase这个模板 ...

  2. ASP.NET没有魔法——ASP.NET MVC 路由的匹配与处理

    ASP.NET MVC的路由是MVC应用的一个核心也是MVC应用处理的入口,作为一个开发者,在正常情况下仅仅需要做的就是根据需求去定义实体.业务逻辑,然后在MVC的Controller中去调用.Vie ...

  3. ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

  4. ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证

    随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的 ...

  5. ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(下篇)

    上一篇<ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)>文章介绍了ASP.NET MVC模型绑定的相关组件和概念,本章将介绍Controller在执行时是如何通过这 ...

  6. ASP.NET没有魔法——ASP.NET MVC Razor与View渲染

    对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的界面呈现工作是由浏览器完成的,Web应用的原理是通过Http协议从服务器上获取到 ...

  7. ASP.NET没有魔法——ASP.NET MVC Razor与View渲染 ASP.NET没有魔法——ASP.NET MVC界面美化及使用Bundle完成静态资源管理

    ASP.NET没有魔法——ASP.NET MVC Razor与View渲染   对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的 ...

  8. ASP.NET没有魔法——ASP.NET MVC 与数据库大集合

    ASP.NET没有魔法——ASP.NET与数据库 ASP.NET没有魔法——ASP.NET MVC 与数据库之MySQL ASP.NET没有魔法——ASP.NET MVC 与数据库之ORM ASP.N ...

  9. ASP.NET没有魔法——ASP.NET 身份验证与Identity

    前面的文章中为My Blog加入了文章的管理功能(ASP.NET没有魔法——ASP.NET MVC使用Area开发一个管理模块),但是管理功能应该只能由“作者”来访问,那么要如何控制用户的访问权限?也 ...

随机推荐

  1. 心路历程(一)-自学java两个月心得

    这是我的第一条博文,在敲这些文字的时候我已经是一名大四的"老者".说自己"老者"确实如此,因为以前每当这个时候大一新学妹有上架了,哈哈,每当这个时候我们就想了很 ...

  2. 3.django Model

    django ORM基本配置 django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表 1.修改project数据库配置 (1)settigs.py里面 默认 DAT ...

  3. 进程,线程,协程,异步IO知识点

    进程: qq 要以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存的管理,网络接口的调用等...对各种资源管理的集合 就可以成为  进程 线程: 是操作系统最小的调度单位, 是一串指令 ...

  4. bind(),unbind(),hover(),toggle(),animate()

    First.bind() bind(Type,fn) type:click/mouseover/mouseout fn:functionsecond.unbind() unbind(Type,fn) ...

  5. 分享一个很通用c语言的Makefile

    编写Makefile是一个苦乐交织的事情,快乐是因为从一堆需要手工逐个处理的编译过程,进步到一条命令完成,看着代码顺畅的在屏幕上滚动,编译为最终的产品,那个过程无比愉悦:而痛苦则是,写代码已经很累了, ...

  6. 关于AJAX异步请求

    一个HTTP请求由4个部分组成: *HTTP请求方法或“动作” *正在请求的URL *一个可选的请求头集合,其中可能包括身份验证信息 *一个可选的请求主体 服务器返回的HTTP响应包含3部分: *一个 ...

  7. javascript中的栈、队列。

                           javascript中的栈.队列 栈方法     栈是一种LIFO(后进先出)的数据结构,在js中实现只需用到2个函数 push()  接受参数并将其放置 ...

  8. Java的类加载器种类(双亲委派)

    Java类加载器采用双亲委派模型: 1.启动类加载器:这个类加载器负责放在<JAVA_HOME>\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别 ...

  9. mongos-sharding连接池配置

    ShardingTaskExecutorPoolMaxSize Maximum number of outbound connections each TaskExecutor connection ...

  10. 【SpringCloud】Zuul在何种情况下使用Hystrix

    首先,引入spring-cloud-starter-zuul之后会间接引入: hystrix依赖已经引入,那么何种情况下使用hystrix呢? 在Zuul的自动配置类ZuulServerAutoCon ...