ASP.NET MVC不可或缺的部分——DI(IOC)容器及控制器重构的剖析
ASP.NET MVC不可或缺的部分——DI(IOC)容器及控制器重构的剖析
IoC框架最本质的东西:反射或者EMIT来实例化对象。然后我们可以加上缓存,或者一些策略来控制对象的生命周期,比如是否是单例对象还是每次都生成一个新的对象。
之前对DI注入与控制器扩展竟然用依赖性解析器来实现,两个方面深感疑惑,由于越学越不懂,越学越头晕,因此就暂且放下了,接着学习,谁知道今天写程序涉及到这些,就继续研究了一下,哪知道,现在研究理解起来越来越顺手,思路也清晰,于是趁热打铁,大概的理解了一遍,虽说学习是个遗忘的过程,至少自己理解过就好...
对于自己现在能够很好地理解这块知识,我觉得是这个原因:学习是个循序渐进的过程,可以一开始我们遇到问题,略作思考研究,实在不行暂且放下,继续往下走,慢慢的等你学习的足够了,有了一定的知识体系,当你在遇到这样的问题时,你就能很好地解决它...
DI:依赖性注入是一种设计模式,用来实现程序块之间的松散耦合
DI容器:本质上是一个智能工厂,它为相互依赖的组件提供抽象,将依赖(低层模块)对象的获得交给第三方(系统)来控制,即依赖对象不在被依赖模块的类中直接通过new来获取,说白点就是创建对象的实例,并且实例化对象的依赖性。
控制器默认只能接受无参的构造函数,但,如果我们需要为其传递参数又该如何做呢?《利用MVC基本工具Ninject消除程序类之间的耦合的简单示例》实现了(相关分析请看《MVC模式中的DI与DI容器理解》)。可是,有个疑问:为什么要用到DI容器来做呢?甚至是依赖性解析器的方法来创建自定义控制器以实现控制器的重构(构造接收参数的控制器)?在我们一般的处理思路来看,应该是从其底层的实现模块来做,最基本的就是自定义控制器,可是为什么可以使用依赖性解析器呢?
分析:
构造有参数的控制器,本质上是重构控制器,向原有的控制器中注入参数,这其实就是依赖性注入DI的一种:构造器注入。我们向控制器的构造函数中传递参数使其能够接受参数:
public HomeController(IValueCalculator calcParam) { calc = calcParam; }
我们为控制器注入了我们的依赖性——IValueCalculator接口,但是,当我们调试的时候,并不能够呈现出页面,相反会给我们报错,这是因为我们单单就是传入了参数而已,控制器的内部还是没有进行半点处理。我们使用依赖性解析器来进行处理,依赖性解析器可以用于实例化控制器。依赖性解析器有两个主要部件组成:
静态的DependencyResolver类,他对解析依赖性扮演着静态网关作用;
IDependencyResolver接口,该接口可以由知道如何解析依赖性的类来实现(通过使用DI容器),而且静态的DependencyResolver将进入该实现进行调用,以执行其工作。
最后DI容器与依赖性解析器就会重构控制器以实现控制器的参数化。
可以得出结论:控制器的参数化可以用依赖性解析器来重构控制器,是因为控制器的参数化,是利用构造器来注入的,构造器注入是依赖性注入的一种形式。DI容器是需要依赖性(一般是接口)的类(这里是控制器)和依赖性的具体实现(一般是接口的继承类)之间的一个第三方组件.依赖性解析器与DI容器两者相互依存
ASP.NET MVC的IOC注入有三种方式,也就是说我们有三种方式来重构控制器:
1.实现了IControllerFactory接口的DefaultControllerFactory;
2.实现了IDependencyResolver接口的DefaultDependencyResolver;
3.实现了IControllerActivator接口的DefaultControllerActivator;
最直接的就是自定义控制器工厂,在ASP.NET MVC 1.0时就是使用这种方法。具体的看《ASP.NET MVC使用自定义控制器工厂来实现IOC注入》
《MVC三个IOC注入点之Ninject使用示例》
ASP.NET MVC不可或缺的部分——DI(IOC)容器及控制器重构的剖析的更多相关文章
- ASP.NET MVC不可或缺的部分——DI(IOC)容器及控制器重构的剖析(DI的实现原理)
IoC框架最本质的东西:反射或者EMIT来实例化对象.然后我们可以加上缓存,或者一些策略来控制对象的生命周期,比如是否是单例对象还是每次都生成一个新的对象. DI实现其实很简单,首先设计类来实现接口, ...
- ASP.NET MVC不可或缺的部分——DI及其本质工作分析
IoC框架最本质的东西:反射或者EMIT来实例化对象.然后我们可以加上缓存,或者一些策略来控制对象的生命周期,比如是否是单例对象还是每次都生成一个新的对象. DI实现其实很简单,首先设计类来实现接口, ...
- 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器
1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...
- ASP.NET MVC 4源码分析之如何定位控制器
利用少有的空余时间,详细的浏览了下ASP.NET MVC 4的源代码.照着之前的步伐继续前进(虽然博客园已经存在很多大牛对MVC源码分析的博客,但是从个人出发,还是希望自己能够摸索出这些).首先有一个 ...
- 解决ASP.NET MVC AllowAnonymous属性无效导致无法匿名访问控制器的问题
在ASP.NET MVC项目中,一般都要使用身份验证和权限控制,但总有部分网页是可以匿名访问的.使用AllowAnonymous属性就可以指定需要匿名访问的控制器,从而跳过身份验证. 但是今天却遇到一 ...
- IOC,DIP,DI,IoC容器
定义 IOC(Inversion of Control 控制反转),DIP(Dependency Inverson Principle 依懒倒置)都属于设计程序时指导原则,并没有具体的实现.比较常用 ...
- asp.net mvc 中"未找到路径“/favicon.ico”的控制器或该控制器未实现 IController。"
FavIcon.ico是一个特殊的文件,它是浏览器请求一个网站时出现的.某些浏览器在书签和收藏夹中使用这个图标.在与这些图标相关的网站被打开时,某些浏览器也在标题栏或浏览器标签中中显示这个图标. 当一 ...
- Spring MVC工作原理及源码解析(一) MVC原理介绍、与IOC容器整合原理
MVC原理介绍 Spring MVC原理图 上图是Spring MVC工作原理图(图片来自网上搜索),根据上图,我们可以得知Spring MVC的工作流程如下: 1.用户(客户端,即浏览器)发送请求至 ...
- asp.net mvc 强类型视图中传入List 数据到控制器
问题来源: 在和一位技术老师聊天时,老师问我一个mvc 表单提交的问题,问道:怎样在表单提交的时候,将 带有 List 属性的对象传入控制器? 这时,我有点呆了,以前一直都好像是 单一属性的表单提交, ...
随机推荐
- CE工具里自带的学习工具--第六关
这一步原理: 相当于有一个变量 int a=100; int *p=&a; 点击修改值, 在ce工具里可以找到a的值. a的地址. 但是在实际代码里,并不是这么处理的, 是 通过指针改变这 ...
- JavaSE-22 反射
学习要点 反射概念 反射的应用 反射概述 1 反射机制 定义 Java反射机制是指在程序在运行状态中,动态获取信息以及动态调用对象方法的功能. Java反射的动态性质:运行时生成对象实例.运行期间调 ...
- mvc core 中使用 redis
redis 下载安装路径: https://github.com/MicrosoftArchive/redis/releases 右键打开cmd命令行,运行命令: .\redis-server.e ...
- [Python3网络爬虫开发实战] 2.1-HTTP基本原理
在本节中,我们会详细了解HTTP的基本原理,了解在浏览器中敲入URL到获取网页内容之间发生了什么.了解了这些内容,有助于我们进一步了解爬虫的基本原理. 1. URI和URL 这里我们先了解一下URI和 ...
- 常见算法的python实现
提到排序算法,常见的有如下几种:冒泡排序.选择排序.插入排序.快速排序.堆排序.归并排序.希尔排序:查找算法最常见二分查找.这些算法的时间复杂度如下: 算法名称 时间复杂度(一般情况) 冒泡排序 O( ...
- windows枚举串口
1. 枚举键值 HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM 2. SETUPAPI方式 int EnumPortsWdm() { int i, d ...
- 洛谷P3373 线段树2(补上注释了)
毒瘤题.找了一下午+晚上的BUG,才发现原来query_tree写的是a%p; 真的是一个教训 UPD:2019.6.18 #include<iostream> #include<c ...
- 原生JS版和jQuery 版实现文件上传功能
<!doctype html> <html lang="zh"> <head> <meta charset="utf-8&quo ...
- swift -从相册中选择照片并上传
选择本地图片并上传是应用开发中一个比较常见的功能. 原文出自:www.hangge.com 转载请保留原文链接:http://www.hangge.com/blog/cache/det ...
- java连接MySQL数据库并读取内容
package sqldemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSe ...