ASP.NET没有魔法——ASP.NET MVC IoC代码篇
上一篇文章主要以文字的形式介绍了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 MVC IoC代码篇的更多相关文章
- ASP.NET没有魔法——ASP.NET MVC IoC
之前的文章介绍了MVC如何通过ControllerFactory及ControllerActivator创建Controller,而Controller又是如何通过ControllerBase这个模板 ...
- ASP.NET没有魔法——ASP.NET MVC 路由的匹配与处理
ASP.NET MVC的路由是MVC应用的一个核心也是MVC应用处理的入口,作为一个开发者,在正常情况下仅仅需要做的就是根据需求去定义实体.业务逻辑,然后在MVC的Controller中去调用.Vie ...
- ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)
上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...
- ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证
随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的 ...
- ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(下篇)
上一篇<ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)>文章介绍了ASP.NET MVC模型绑定的相关组件和概念,本章将介绍Controller在执行时是如何通过这 ...
- ASP.NET没有魔法——ASP.NET MVC Razor与View渲染
对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的界面呈现工作是由浏览器完成的,Web应用的原理是通过Http协议从服务器上获取到 ...
- ASP.NET没有魔法——ASP.NET MVC Razor与View渲染 ASP.NET没有魔法——ASP.NET MVC界面美化及使用Bundle完成静态资源管理
ASP.NET没有魔法——ASP.NET MVC Razor与View渲染 对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的 ...
- ASP.NET没有魔法——ASP.NET MVC 与数据库大集合
ASP.NET没有魔法——ASP.NET与数据库 ASP.NET没有魔法——ASP.NET MVC 与数据库之MySQL ASP.NET没有魔法——ASP.NET MVC 与数据库之ORM ASP.N ...
- ASP.NET没有魔法——ASP.NET 身份验证与Identity
前面的文章中为My Blog加入了文章的管理功能(ASP.NET没有魔法——ASP.NET MVC使用Area开发一个管理模块),但是管理功能应该只能由“作者”来访问,那么要如何控制用户的访问权限?也 ...
随机推荐
- [Swift]LeetCode321. 拼接最大数 | Create Maximum Number
Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum numb ...
- dedecms搜索模板,使用{dede:list}标签调用自定义字段不显示(空白)
前几天使用织梦做一个搜索功能,正常使用{dede:list}调用自定义内容模型中的自定义字段,代码如下:(自定义字段的调用可以参考:http://www.dede58.com/a/dedejq/523 ...
- mysql tablespace(独立表空间)超速备份大数据
前序 对于用户自主创建的表,会采用此种模式,每个表由一个独立的表空间进行管理备份(速度相当的猛) 首先介绍一下文件 .ibd就被称之为独立表空间的数据文件 .frm就是元数据文件 就是创建表后生成的 ...
- scala的input
获取用户输入的信息,一般使用 input 函数,但是 scala 里面是没有 input 这个方法的,为了获取控制台的输入操作, scala 定义的方法为: val Inputcontent = Co ...
- 又拍云 API 使用的那些小事
又拍云提供了丰富的 API 调用,为了减少用户在初次接入时可能会遇到的坑”,本文将对又拍云常用的 API 使用方法做个简单的梳理,力求让业务接入变得更简单,更高效. 目前我们的 API 主要有四大类, ...
- AspNetCore 使用NLog日志,NLog是基于.NET平台开的类库!(又一神器)
NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码. NLog是一个简单灵活的.NET日志记录类库.通过使用NLog,我们可以在任何一种.NET语言中 ...
- CentOS 7 安装 Jenkins
准备工作 首选需要安装JAVA环境 https://www.cnblogs.com/stulzq/p/9286878.html 如果你的系统没有自带git,那么也需要安装一个 yum install ...
- C# - 2017微软校园招聘笔试题 之 MS Recognition[待解决]
MS Recognition 在线提交: hihoCoder 1402 http://hihocoder.com/problemset/problem/1402 类似: OpenJudge - I:P ...
- pymysql.err.InternalError: (1205, 'Lock wait timeout exceeded; try restarting transaction')错误处理
问题描述: 在使用pymysql库时,利用游标执行插入操作,产生错误,会出现pymysql.err.InternalError: (1205, 'Lock wait timeout exceeded; ...
- EF架构~Dapper.Contrib不能将Linq翻译好发到数据库,所以请不要用它
回到目录 对于Dapper是一个轻量级的数据访问框架,而需要使用者去自己做SQL,它,只是一个数据访问者! 对些,Dapper推出了Contrib扩展包,它可以友好的让开发人员使用linq,而不需要写 ...