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 属性的对象传入控制器? 这时,我有点呆了,以前一直都好像是 单一属性的表单提交, ...
随机推荐
- Java IO(四--字符流基本使用
在上一节,介绍了字节流的基本使用,本节介绍一下字符流的使用 Reader: public abstract class Reader implements Readable, Closeable { ...
- JavaSE-13 内部类
学习要点 内部类的定义 内部类的应用 内部类 定义 Java的一个类中包含着另一类. A类和B类是C类的外部类.B类是C类的外部类.A类也称为顶层类. 如何使用内部类 public class MyF ...
- viewDidLoad等相关函数调用
viewDidLoad 此方法只有当view从nib文件初始化的时候才被调用.viewDidLoad用于初始化,加载时用到的. loadView 此方法在控制器的view为nil的时候被调用.虽然经常 ...
- 【简●解】POJ 1845 【Sumdiv】
POJ 1845 [Sumdiv] [题目大意] 给定\(A\)和\(B\),求\(A^B\)的所有约数之和,对\(9901\)取模. (对于全部数据,\(0<= A <= B <= ...
- 全国高校绿色计算大赛 预赛第三阶段(Python)(随机数)
只提交了随机数 (真心不会 T-T ) import csv import random import pandas as pd import numpy as np # 预测结果文件:src/ste ...
- [BZOJ] 1037 [ZJOI2008]生日聚会
Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3007 Solved: 1795 [Submit][Status][Discuss] Descript ...
- sql分组和连接
SELECT mr.member_id, mr.username, GROUP_CONCAT(DISTINCT jb.company,jb.start_time,jb.end_time)company ...
- 小甲鱼Python学习笔记
一 isdigit()True: Unicode数字,byte数字(单字节),全角数字(双字节),罗马数字False: 汉字数字Error: 无 isdecimal()True: Unicode数字, ...
- ubuntu环境安装docker
查看已安装的docker apt list docker* 如果已安装,并且需要卸载,则执行以下命令: apt remove docker* 更新apt索引 apt update apt需要支持HTT ...
- 用python爬取一张仓鼠图片
一. 找到一张仓鼠图片并复制一下它的url url='http://img.go007.com/2017/08/16/c407f5b732f4e748_2.jpg' 二. 调用urllib库 impo ...