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开发一个管理模块),但是管理功能应该只能由“作者”来访问,那么要如何控制用户的访问权限?也 ...
随机推荐
- React 中的this.setState
在react中如何修改state中的数据 第一种写法:this.setState() 参数1:对象 需要修改的数据 参数2:回调 this.setState是一 ...
- vs2013+opencv3.2配置
opencv库在3.0以后分为opencv库和opencv_contrib库两部分,其中opencv_contrib库是一个扩展库,如果需要使用SIFT和SURF算法就需要安装这个扩展库,否则只用安装 ...
- Java核心技术及面试指南的视频讲解和代码下载位置
都是百度云盘,均无密码 代码下载位置: https://pan.baidu.com/s/1I44ob0vygMxvmj2BoNioAQ 视频讲解位置: https://pan.baidu.com/s/ ...
- https和http共存的nginx简单配置
server{ listen 80; listen 443 ssl; ssl_certificate /usr/local/nginx/ssl/www.demo.com/www.demo.com.cn ...
- 『Tarjan算法 无向图的割点与割边』
无向图的割点与割边 定义:给定无相连通图\(G=(V,E)\) 若对于\(x \in V\),从图中删去节点\(x\)以及所有与\(x\)关联的边后,\(G\)分裂为两个或以上不连通的子图,则称\(x ...
- Chapter 5 Blood Type——1
The rest of the morning passed in a blur. 早上剩下的时间都在模糊中度过了. It was difficult to believe that I hadn't ...
- 一文带你看透kubernetes 容器编排系统
本文由云+社区发表 作者:turboxu Kubernetes作为容器编排生态圈中重要一员,是Google大规模容器管理系统borg的开源版本实现,吸收借鉴了google过去十年间在生产环境上所学到的 ...
- 原生JS forEach()和map()遍历的区别以及兼容写法
一.原生JS forEach()和map()遍历 共同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前 ...
- 第33章 密码学(Cryptography),密钥(Keys)和HTTPS - Identity Server 4 中文文档(v1.0.0)
IdentityServer依赖于几个加密机制来完成它的工作. 33.1 令牌签名和验证 IdentityServer需要非对称密钥对来签署和验证JWT.此密钥对可以是证书/私钥组合或原始RSA密钥. ...
- Java开发笔记(八)五种算术运算符
计算机科学起源于数学,早期的计算机也确实多用于数学运算,以至于后来的各路编程语言,仍然保留着古老的加减乘除四则运算.这四则运算在Java语言中有专门的运算符加以表示,像加法符号“+”对应Java的“+ ...