上一篇文章主要以文字的形式介绍了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. [Swift]LeetCode287. 寻找重复数 | Find the Duplicate Number

    Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), pro ...

  2. Git使用基础介绍

    git教程:一.git的简介:    -git是分布式版本控制系统由Linus为Linux用C语言写的.  -什么是集中式版本控制系统:       版本库是集中存放在中央服务器,干活的时候用自己的电 ...

  3. Linux 中改变主机名的 4 种方法

    今天,我们将向你展示使用不同的方法来修改主机名.你可以从中选取最适合你的方法. 使用 systemd 的系统自带一个名为 hostnamectl 的好用工具,它可以使我们能够轻易地管理系统的主机名. ...

  4. 解决SpringMVC中文乱码问题 -----这是服务器返回参数到前端中文乱码

    方法一,使用(produces = "application/json; charset=utf-8"): @RequestMapping(value="/getUser ...

  5. 安装需要的第三方库时,命令行输入pip提示不是内部或外部命令

    简介 在做Python开发时,安装需要的第三方库时,大多数人喜欢选择在命令行用pip进行安装. 然而有时敲入pip命令会提示‘pip’不是内部或外部命令..如图: 解决办法 1.在python安装目录 ...

  6. IIS连接数据库:数据库连接出错,请检查连接字串

    搞了一早上,在网上看了各种回答,比如:C盘下的Temp文件夹权限.CONN.asp中的数据库路径问题,都不通.最后发现是: 如果使用的是64位系统,原因有可能是没有64位Access连接驱动. 所以解 ...

  7. Config ConnectionStrings

    <connectionStrings> <add name ="MyschoolConnectionString" connectionString =" ...

  8. asp.net core系列 23 EF模型配置(概述, 类型和属性的包含与排除)

    一.模型配置概述 EF使用一组约定基于实体类的定义来构建模型. 可指定其他配置以补充或替代约定的内容.本系列介绍的配置可应用于面向任何数据存储的模型,以及面向任意关系数据库时可应用的配置. 数据库提供 ...

  9. 那些令人惊艳的TensorFlow扩展包和社区贡献模型

    随着TensorFlow发布的,还有一个models库(仓库地址:https://github.com/tensorflow/models),里面包含官方及社群所发布的一些基于TensorFlow实现 ...

  10. dotnet core高吞吐Http api服务组件FastHttpApi

    简介 是dotNet core下基于Beetlex实现的一个高度精简化和高吞吐的HTTP API服务开源组件,它并没有完全实现HTTP SERVER的所有功能,而是只实现了在APP和WEB中提供数据服 ...