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)容器及控制器重构的剖析的更多相关文章

  1. ASP.NET MVC不可或缺的部分——DI(IOC)容器及控制器重构的剖析(DI的实现原理)

    IoC框架最本质的东西:反射或者EMIT来实例化对象.然后我们可以加上缓存,或者一些策略来控制对象的生命周期,比如是否是单例对象还是每次都生成一个新的对象. DI实现其实很简单,首先设计类来实现接口, ...

  2. ASP.NET MVC不可或缺的部分——DI及其本质工作分析

    IoC框架最本质的东西:反射或者EMIT来实例化对象.然后我们可以加上缓存,或者一些策略来控制对象的生命周期,比如是否是单例对象还是每次都生成一个新的对象. DI实现其实很简单,首先设计类来实现接口, ...

  3. 一个由正则表达式引发的血案 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. 一些特殊字符,如“&”,“- ...

  4. ASP.NET MVC 4源码分析之如何定位控制器

    利用少有的空余时间,详细的浏览了下ASP.NET MVC 4的源代码.照着之前的步伐继续前进(虽然博客园已经存在很多大牛对MVC源码分析的博客,但是从个人出发,还是希望自己能够摸索出这些).首先有一个 ...

  5. 解决ASP.NET MVC AllowAnonymous属性无效导致无法匿名访问控制器的问题

    在ASP.NET MVC项目中,一般都要使用身份验证和权限控制,但总有部分网页是可以匿名访问的.使用AllowAnonymous属性就可以指定需要匿名访问的控制器,从而跳过身份验证. 但是今天却遇到一 ...

  6. IOC,DIP,DI,IoC容器

    定义 IOC(Inversion of Control  控制反转),DIP(Dependency Inverson Principle 依懒倒置)都属于设计程序时指导原则,并没有具体的实现.比较常用 ...

  7. asp.net mvc 中"未找到路径“/favicon.ico”的控制器或该控制器未实现 IController。"

    FavIcon.ico是一个特殊的文件,它是浏览器请求一个网站时出现的.某些浏览器在书签和收藏夹中使用这个图标.在与这些图标相关的网站被打开时,某些浏览器也在标题栏或浏览器标签中中显示这个图标. 当一 ...

  8. Spring MVC工作原理及源码解析(一) MVC原理介绍、与IOC容器整合原理

    MVC原理介绍 Spring MVC原理图 上图是Spring MVC工作原理图(图片来自网上搜索),根据上图,我们可以得知Spring MVC的工作流程如下: 1.用户(客户端,即浏览器)发送请求至 ...

  9. asp.net mvc 强类型视图中传入List 数据到控制器

    问题来源: 在和一位技术老师聊天时,老师问我一个mvc 表单提交的问题,问道:怎样在表单提交的时候,将 带有 List 属性的对象传入控制器? 这时,我有点呆了,以前一直都好像是 单一属性的表单提交, ...

随机推荐

  1. ANALYZE - 收集与数据库有关的统计

    SYNOPSIS ANALYZE [ VERBOSE ] [ table [ (column [, ...] ) ] ] DESCRIPTION 描述 ANALYZE 收集有关 PostgreSQL ...

  2. TCP/IP 协议分层

    协议分层 可能大家对OSI七层模型并不陌生,它将网络协议很细致地从逻辑上分为了7层.但是实际运用中并不是按七层模型,一般大家都只使用5层模型.如下: 物理层:一般包括物理媒介,电信号,光信号等,主要对 ...

  3. mybatis generator 覆盖xml文件

    mybatis generator默认采用追加方式生成,所以我们如果要重新生成代码的时候那么要先删除原来的文件. 解决办法: 1:创建一个自定义补丁类. OverwriteXmlPlugin.java ...

  4. cacheStorage缓存及离线开发

    案例地址:https://zhangxinxu.github.io/https-demo/cache/start.html 我们直接看一个例子吧,如下HTML和JS代码: <h3>一些提示 ...

  5. CSU1008: Horcrux

    Description A Horcrux is an object in which a Dark wizard or witch has hidden a fragment of his or h ...

  6. mysql主库与从库配置(并行复制配置)

    主库: [mysqld] server-id = 2233port = 13306basedir = /usr/local/mysqldatadir = /usr/local/mysql/data s ...

  7. thinkphp3.2使用PHPQrcode实现二维码

    Thinkphp中没有二维码相关的生成库,百度有不少工具和库 这里就实例一下通过think3.2搭配phpqrcode来完成生成二维码的功能. 至于phpQrcode库文件 百度很容易找到这里也给大家 ...

  8. PDO、PDOStatement、PDOException

    最近在学PDO  比较详细的资料 出处:http://blog.csdn.net/hsst027/article/details/23682003 PDO中包含三个预定义的类,它们分别是PDO.PDO ...

  9. Tensor数据类型

    目录 Tensor数据类型 属性 数据类型判断 数据类型转换  tensor转numpy Tensor数据类型 list: [1,1.2,'hello'] ,存储图片占用内存非常大 np.array, ...

  10. Python之微信-微信机器人

    一 简介 二 登录微信 三 微信好友男女比例 四 微信好友地域分布 五 微信聊天机器人 一 简介 wxpy基于itchat,使用了 Web 微信的通讯协议,,通过大量接口优化提升了模块的易用性,并进行 ...