[转]第二章 控制反转和依赖注入

Spring.Net 中提供了很多功能,比如依赖注入,面向切面编程(AOP),数据访问抽象以及ASP.Net扩展等等的功能。而其中最核心的功能就是依赖注入(Dependency Injection),而使用依赖注入带来的最大好处就是能够通过它降低应用程序中对象与对象之间的耦合。

  控制反转(Inversion of Control)和 依赖注入(Dependency Injection),他们的英文缩写分别是IOC和DI,其实它们是同一个概念的不同角度的描述,由于控制反转概念比较模糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级别人物Martin Flower又给出了一个新名字:”依赖注入”,相对控制反转而言,“依赖注入”又 确描述了被注入对象依赖IOC容器配置以来对象。

  IOC 也称为 “依赖倒置原则”("Dependency Inversion Principle") 或 “依赖倒置原则”。在面向对象编辑几大原则中 “依赖倒置原则“是非常重要的,差不多所有框架都使用了“倒置注入“(Martin Fowler 2004年发布的论文中有提到)技巧,这可说是IOC原理的一项应用。C++, Java 或各种.NET 语言等面向对象程序语言的程序员已使用了这些原理。

2.1 熟悉的代码存在着潜在的危机

  这是我们以前写代码的方式,这里就使用园子来举个例:

  我们现在需要获取园里各位人物的文章,现在提供了一个 取文章的数据访问接口IReaderDAL ,和一个取文章的业务逻辑接口IReaderService , 通过在业务逻辑实现类中调用数据访问实现类的方法来获取文章。

 1 namespace CnblogLesson_2_1
 2 {
 3     /// <summary>
 4     /// 读取文章的数据数据访问接口
 5     /// </summary>
 6     public interface IReaderDAL
 7     {
 8         /// <summary>
 9         /// 读取文章的方法
10         /// </summary>
11         void GetArticle();
12     }
13 }

 1 namespace CnblogLesson_2_1
 2 {
 3     /// <summary>
 4     /// 读取文章的业务逻辑接口
 5     /// </summary>
 6     public interface IReaderService
 7     {
 8         /// <summary>
 9         /// 读取文章的方法
10         /// </summary>
11         void GetArticle();
12     }
13 }

 1 using System;
 2 namespace CnblogLesson_2_1
 3 {
 4     /// <summary>
 5     /// 读取文章的数据访问类
 6     /// </summary>
 7     public class ReaderDAL : IReaderDAL
 8     {
 9        /// <summary>
10         ///读取文章的方法
11         /// </summary>
12         public void GetArticle()
13         {
14             Console.WriteLine("取得博客园Spring.Net系列的博文");
15         }
16     }
17 }

 1 using System;
 2 namespace CnblogLesson_2_1
 3 {
 4     /// <summary>
 5     /// 读取文章的业务逻辑类
 6     /// </summary>
 7     public class ReaderService : IReaderService
 8     {
 9         /// <summary>
10         /// 读取文章的数据访问类对象
11         /// </summary>
12         private IReaderDAL dal = new ReaderDAL();
13
14         /// <summary>
15         /// 读者的名字
16         /// </summary>
17         private string Name { get; set; }
18
19         /// <summary>
20         /// 读取文章的方法
21         /// </summary>
22         public void GetArticle()
23         {
24             dal.GetArticle();
25         }
26     }
27 }

上面是博客园读者的数据访问类和业务逻辑类,来看一下以往我们的调用方式。

 1 using System;
 2 namespace CnblogLesson_2_1
 3 {
 4     class Program
 5     {
 6         static void Main(string[] args)
 7         {
 8             IReaderService service = new ReaderService();
 9             service.GetArticle();
10             Console.ReadKey();
11         }
12     }
13 }

以上方式的缺点:

  IReaderDAL对象是在 ReaderService内部创建并维护,严重依赖于具体实现,而不是接口。 在不改代码的情况下就非常难以扩展和维护。 例如,我们现在获取园子文章的方式变了,原来使用ReaderDAL的GetArticle方法来获取,现在变成通过WebService来获取,哪又如何是好,只能重新修改ReaderService内部的代码。

解决办法:

  使用所谓的Ioc(控制反转),就是应用本身不负责依赖对象的创建和维护(好处就是解耦的各个对象之间相互的依赖),将依赖 对象创建和维护的权力交由外部容器,比如,我们将具体要创建的对象交给配置文件。通过配置文件来决定,从园子获取文章的方式是通过ReaderDAL类还是通过WebService ,当需要切换获取方式的时候只需要修改配置,无需修改代码就可以完成。这样控制权就到了外部容器,这就叫 控制反转。从运行时来看,由外部容器动态的将依赖对象注入到应用程序中。也可以理解为动态的通过xml配置,将获取文章方式传入ReaderService中。这样的方式叫做DI(依赖注入)。

2.2 使用依赖注入和控制反转之后如何解耦

  我们在对IReaderDAL对象的创建和维护上做出了改变,改为使用依赖注入的方式,IReaderDAL通过配置文件动态注入到应用程序,或者说是IReaderDAL对象的创建和维护的权力从IReaderService内部转移到了外部,交给配置文件来控制。

这个时候我们来回顾一下2.1章节里对控制反转和依赖注入的描述,我们将更好的理解他们的含义。

 1 using Spring.Context.Support;
 2 namespace CnblogLesson_2_2
 3 {
 4     /// <summary>
 5     /// 读取文章的业务逻辑类
 6     /// </summary>
 7     public class ReaderService : IReaderService
 8     {
 9         /// <summary>
10         /// 读取文章的数据访问类对象
11         /// </summary>
12         private IReaderDAL dal ;
13
14         public ReaderService() {
15
16             //通过IApplicationContext来配置
17             IApplicationContext context = ContextRegistry.GetContext();
18             dal = (IReaderDAL)context.GetObject("readerDal");
19         }
20
21         /// <summary>
22         /// 读者的名字
23         /// </summary>
24         private string Name { get; set; }
25
26         /// <summary>
27         /// 读取文章的方法
28         /// </summary>
29         public void GetArticle()
30         {
31             dal.GetArticle();
32         }
33     }
34 }

朋友们,上面使用到了Spring.Net框架的IOC容器,但这里只讨论依赖注入和控制反转的思想,实际上可以追溯到依赖倒置原则,依赖倒置原则说“抽象不应该依赖于细节。细节应该依赖与抽象 “。目前,暂时不要关心Spring.Net 的IOC容器是怎样配置和搭建起来的,在接下来的章我们会对这些问题一一起讨论。

示例代码:http://download.csdn.net/detail/cilence6788/5077849

时间: 2024-10-24 02:15:29

[转]第二章 控制反转和依赖注入的相关文章

工厂模式、控制反转及依赖注入

在介绍工厂模式与控制反转(Inversion of Control)及依赖注入(Dependency Injection)之前,先介绍下类的调用方法.目前调用方法总共有3种:1.自己创建:2.工厂模式:3.外部注入,其中外部注入即为控制反转/依赖注入模式(IoC/DI).我们可以用3个形象的东西来分别表示它们,就是new.get.set.顾名思义,new表示自己创建,get表示主动去取(即工厂),set表示是被别人送进来的(即注入),其中get和set分别表示了主动去取和等待送来两种截然相反的特

控制反转与依赖注入

关于控制反转和依赖注入的文章和书籍很多,对其定义也解释的也仁者见仁,这里就不赘述了,这是本人(只代表个人观点)理解之后用通俗的例子和平淡的话词为您解释,希望对您有所帮助: 控制反转(IoC/Inverse Of Control):   调用者不再创建被调用者的实例,由spring框架实现(容器创建)所以称为控制反转. 依赖注入(DI/Dependence injection) :   容器创建好实例后再注入调用者称为依赖注入. 当 某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个

.Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用

再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下,还是解耦吧,本来按照软件设计模式就应该是高内聚低耦合的,低耦合使项目的模块独立于其他模块,增加了可维护性和移植性! 注:前面写的博客详细记录没项目操作的每一步,其实写起博客来很费时间,而且整片博文里很多无用的信息.对MVC来说会添加控制器,添加视图,添加类这些都最基本的要求了,并且前面博文里都写了,

轻松了解Spring中的控制反转和依赖注入

我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达170平方米,重达30吨,到现如今的个人笔记本,事物更加轻量功能却更加丰富,这是事物发展过程中的一个趋势,在技术领域中同样也是如此,企业级JavaBean(Enterprise JavaBean ,EJB)在创建之初是非常成功,但是时间一久人们便开始追逐更加方便更加简易和轻量级的技术框架实现,于是Spring就应运而生,并且Sring一直开始不断地涉及到其他领域(这里就不再多详谈了),而Spring的精髓当中就包括控制反转和依赖注入. 浅

轻松了解Spring中的控制反转和依赖注入(二)

紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类之间的结构图如下 以下是代码 BeanFactor接口:在Spring源码中的定义是:持有对一定数量的Bean的定义,同时每个Bean都被唯一标识的对象(类),需要实现这个接口.根据对Bean的定义,该工厂将会返回一个包含Bean定义的对象的独立实例(原型设计模式),或者单例共享(一个不错的单例设计模式,)范

我曾想深入了解的:依赖倒置、控制反转、依赖注入

大道至简 我们在软件工程中进行的架构设计.模块实现.编码等工作,很多时候说到底就是围绕一件事进行:解耦. 三层架构,MVC,微服务,DDD.我们分析问题,抽象问题,然后划分边界,划分层次. 也是为了让我们的类.模块.系统有更强的复用能力,提高生产效率. 这一次,我想深入了解和探讨我曾经很迷糊,也没有一直仔细了解的:依赖倒置.控制反转.依赖注入 这些概念. 什么是依赖? 通常可以理解为一种需要,需求.需要协助才能完成一件事情. 例如,我们依赖日志服务写日志: public class Contra

Spring 基础 控制反转和依赖注入

Spring框架两个最重要的知识点 1.IOC(控制反转)/DI(依赖注入):把整个项目中的所有对象交给Spring容器管理 IOC:取到对象 DI:对象的装配 依赖注入有两种方式: 1.      属性值注入方式 a.     普通类型 注入方式 b.bean注入方式 测试结果 在使用普通类型方式注入的时候,我们会有一些特殊字符,处理这种特殊字符时 我们会想使特殊字符保持原有的样子,这时候就要使用CDATA,就如上一张图片所示 2.构造参数注值方式 在一般情况,一个类会有一个默认的无参构造函数

spring(3)------控制反转(IOC)/依赖注入(DI)

一,spring核心概念理解 控制反转: 控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理. 所谓的"控制反转"概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器. 没有控制反转这种模式前,你创建一个对象,在什么地方用,你得单独通过关键字new出来用, 但现在可以不用这样,你把new对象的权利交给spring配置文件,通过配置文件来'new', 就是权利的反转,你以前干的事

Spring框架之控制反转和依赖注入

学Spring框架必须理解控制反转和依赖注入.下面各自举一个例子,来说明. IOC(控制反转):应用本身创建和维护的依赖对象:现在交由外部容器(Spring)来创建和维护:这个控制权的转移: 就叫做控制反转. 第一步:配置applicationContextcreateproject.xml和applicationcontext.xml(总体) <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=