ASP.NET MVC不可或缺的部分——DI及其本质工作分析
IoC框架最本质的东西:反射或者EMIT来实例化对象。然后我们可以加上缓存,或者一些策略来控制对象的生命周期,比如是否是单例对象还是每次都生成一个新的对象。
DI实现其实很简单,首先设计类来实现接口,而不是把所有的程序逻辑写在一个类文件中,然后我们传入一个接口和一个继承自接口的类作为参数,然后我们在相应的函数那将泛型参数T作为形参,伪代码:
//调用部分
HandleDI<ITest, Test>
//实现部分
HandleDI<TInterface, T>
// 使用反射,EMIT,委托来实例化T创建TInterface的对象
然后我们使用反射或者EMIT或是委托TInterface对象。这就是DI的实现过程。
DI说白了,作用就是实例化继承自接口的类
之前对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及其本质工作分析的更多相关文章
- ASP.NET MVC不可或缺的部分——DI(IOC)容器及控制器重构的剖析
ASP.NET MVC不可或缺的部分——DI(IOC)容器及控制器重构的剖析 IoC框架最本质的东西:反射或者EMIT来实例化对象.然后我们可以加上缓存,或者一些策略来控制对象的生命周期,比如是否 ...
- ASP.NET MVC不可或缺的部分——DI(IOC)容器及控制器重构的剖析(DI的实现原理)
IoC框架最本质的东西:反射或者EMIT来实例化对象.然后我们可以加上缓存,或者一些策略来控制对象的生命周期,比如是否是单例对象还是每次都生成一个新的对象. DI实现其实很简单,首先设计类来实现接口, ...
- [ASP.NET MVC 小牛之路]04 - 依赖注入(DI)和Ninject
本人博客已转移至:http://www.exblr.com/liam 为什么需要依赖注入 在[ASP.NET MVC 小牛之路]系列的理解MVC模式文章中,我们提到MVC的一个重要特征是关注点分离( ...
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
ADO.NET 一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data → DataTable, ...
- Asp.net 面向接口可扩展框架之“Mvc扩展框架及DI”
标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整 ...
- 自学MVC看这里——全网最全ASP.NET MVC 教程汇总
MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口.本文从 ...
- 翻译:使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 1
原文地址:http://ddmvc4.codeplex.com/ 原文名称:Design and Develop a website using ASP.NET MVC 4, EF, Knockout ...
- 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目 目录索引
索引 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目(1)搭建MVC环境 注册区域 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目(2)创建 ...
- 使用IdleTest进行TDD单元测试驱动开发演练(3) 之 ASP.NET MVC
一.[前言] (1)本文将用到IOC框架Unity,可参照<Unity V3 初步使用 —— 为我的.NET项目从简单三层架构转到IOC做准备>(2)本文的解决方案是基于前述<使用I ...
随机推荐
- 初识ActiveMQ
消息中间件的初步认识 什么是消息中间件? 消息中间件是利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排队模型,可以在分布式架构下扩展进程 ...
- jsp 修饰 Request 及Response
Servlet API包含4个可修饰的类,用于改变Servlet Request以及Servlet Response.这种修饰允许修改 ServletRequest以及ServletResponse或 ...
- lightoj1259 线性筛的另一种写法 v变成bool标记数组
也是用线性筛,但是v用int会爆,所以这个线性筛用的是另外一种写法 #include<cstdio> #include<cmath> #include<queue> ...
- vue指令
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>指令 ...
- (转)一位资深程序员大牛给予Java初学者的学习路线建议
Java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每 ...
- 论文阅读笔记二-ImageNet Classification with Deep Convolutional Neural Networks
分类的数据大小:1.2million 张,包括1000个类别. 网络结构:60million个参数,650,000个神经元.网络由5层卷积层,其中由最大值池化层和三个1000输出的(与图片的类别数相同 ...
- spring+redis的集成,redis做缓存
1.前言 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.我们都知道,在日常的应用中,数据库瓶颈是最容易出现的 ...
- HUAWEI USG6000系列 & NGFW Module V100R001 典型配置案例
https://support.huawei.com/enterprise/zh/doc/DOC1000047742?section=j00d
- Flink--将表转换为DataStream或DataSet
A Table可以转换成a DataStream或DataSet.通过这种方式,可以在Table API或SQL查询的结果上运行自定义的DataStream或DataSet程序 将表转换为DataSt ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-8项目加密解密方案
本文目录1. 摘要2. MD5加密封装3. AES的加密.解密4. DES加密/解密5. 总结 1. 摘要 C#中常用的一些加密和解密方案,如:md5加密.RSA加密与解密和DES加密等,Asp.N ...