浅析依赖注入

菜鸟D曾经的一个项目使用的是Spring.Net框架,是将java的Spring框架移植到.Net平台上来。但是它的核心思想没有发生什么变化,依然是——依赖注入和控制反转。

老规矩,说一下依赖注入和控制反转的通用定义:
     依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。

菜鸟D表示很精炼,但是看不太懂。幸好,上一次大牛给我留了一些代码,本来是给我讲解委托事件的,但是其中的一些东西还是有利于依赖注入的理解的。
简化代码如下:

 public interface IFrame  //定义一个接口
    {
        void Add();
        void Edit();
        void Save();
    }

    class FX操作1 : IFrame
    {
        public void Add()
        {
            MessageBox.Show("操作1");
        }

        public void Edit()
        {
        }

        public void Save()
        {
        }
    }

    class FX操作2 : IFrame
    {
        public void Add()
        {
            MessageBox.Show("操作2");
        }

        public void Edit()
        {
        }

        public void Save()
        {
        }
    }

    //自定义控件
    public partial class FrameTwo : UserControl
    {
        public IFrame BindFrame
        {
            get;
            set;
        }

        public FrameTwo()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (BindFrame == null) return;

            BindFrame.Add();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (BindFrame == null) return;

            BindFrame.Edit();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (BindFrame == null) return;

            BindFrame.Save();
        }
    }

    //主界面:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        private void radioButton1_Click(object sender, EventArgs e)
        {
            if (radioButton1.Checked)
            {
                this.frameTwo1.BindFrame = new FX操作1();
            }
            else
            {
                this.frameTwo1.BindFrame = new FX操作2();
            }
        }
    }

可能代码有点乱,但是核心是最后的几行代码,采用接口可以实现多态,增加了可调用方法的种类,也提高了通用性。当我们把 new FX操作1()或者new FX操作2()放到另一个类(工厂或者容器)中,这就是一个spring的雏形。(个人观点,欢迎指正)代码的原意是封装一个拥有三个按钮的自定义控件,我们不知道触发点击事件后会发生什么,内部无法判断从而无法处理,于是将判断的逻辑放在外部,通过接口向控件内部“注入”一个“IFrame”的实体(其实就是控件内部可以调用外部不属于控件的方法)。控件在依靠外部的注入,外部给他提供什么样的类(此例,如接口),它就执行类中相应的方法。这时,就可以看到提供new FX操作1()或者new FX操作2()的“容器”为控件提供了注入的功能,而控件不需要自己来创建 FX操作1()或者 FX操作2(),这就实现了控制的反转。此例中spring(暂且如此称呼)将控件与操作类的耦合解开了,但是spring自身与操作类又耦合上了,相较而言解开操作类和控件的耦合才是我们需要的。

菜鸟D的看法是,编程中没有设计模式,所谓的设计模式只在做一件事——解耦。我们解开了实体类和操作类的耦合,但是却将操作类和工厂耦合在一起,想要解开操作类和工厂的耦合,又有可能会造成新的耦合,我们在不同的场景采用不同的解耦手段,这些手段被总结起来就叫做设计模式。

菜鸟D希望这篇白话对您有所帮助。

以下部分可能会对您有所帮助:
http://blog.csdn.net/taijianyu/article/details/2338311/
这篇文章的人和斧头的例子,感觉还是很不错的,对于依赖注入和控制反转的核心思想的理解还是挺有帮助的,代码是java的,学C#的也不难看懂。
http://www.cnblogs.com/leoo2sk/archive/2009/06/17/1504693.html
这篇文章比较深,但是不难理解,而且是层次递进,读起来也很容易。

时间: 2024-10-26 02:29:30

浅析依赖注入的相关文章

浅析依赖注入框架Autofac的使用

Autofac是一款IOC框架,比起Spring.NET,Unity,Castle等等框架,它很轻量级且性能也很高,下面小编给大家介绍下依赖注入框架Autofac的使用. 下面通过代码给大家分享下依赖注入框架Autofac的使用,具体如下所示:  Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上也是很高的. 1)解压它的压缩包,主要看到Autofac.dll,Autofac.Configuration.dll,

Android Dagger依赖注入框架浅析

今天接触了Dagger这套android的依赖注入框架(DI框架),感觉跟Spring 的IOC差不多吧.这个框架它的好处是它没有采用反射技术(Spring是用反射的),而是用预编译技术,因为基于反射的DI非常地耗用资源(空间,时间) 由于现在开发都是用Android Studio了,所以我这里大概讲下配置Dagger框架的开发环境,需要怎么做. (由于Android Studio中用Gradle,所以跟传统我们用Eclipse配置的话,直接导入jar包,有点不一样.) 在开始看我的博文前,希望

大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC

原文:大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC   转发时请注明原创作者及地址,否则追究责任.原创:alunchen 在上一篇文章中,我们聊了很多关于定义的方面,比较孤燥,下面我们结合.Net Core聊一下依赖注入&控制反转. 三种对象生命周期 关于.Net Core中的容器,有三种对象的生命周期,这个从网上搜索也有大堆的资料.为了循序渐进,我们这里介绍一下. Transient 称为短暂,意思是需要使用时就创建一个新的对象.从容易层面讲,当从容器取出

辛星浅析phalcon中常用的依赖注入

其中phalcon也使用了依赖注入,而且phalcon在启动的过程中,需要使用很多的类,这些类都是通过依赖注入来进行配置的,然后通过加载器来载入的,下面介绍一下对于经常需要注入的服务. 对于路由器router,它负责解析url参数,该类文件是 \Phalcon\Mvc\Router,它的add参数类配置一个路由,下面是一个添加的范例: $di->set('router', function () { $router = new \Phalcon\Mvc\Router(); $router->a

浅析Dragger2依赖注入实现过程

Dragger2是Android应用开发中一个非常优秀的依赖注入框架.本文主要通过结合Google给出的MVP开发案例todo-mvp-dagger(GitHub连接地址:https://github.com/googlesamples/android-architecture/tree/todo-mvp-dagger/),简要分析一下Dragger2的依赖注入实现过程. 如果是刚入手学习Dragger2,这里推荐三篇非常不错的连载文章:http://www.jianshu.com/p/cd2c

Spring依赖注入浅析

1. 概念理解 依赖注入 谁注入谁? 依赖对象注入IoC容器. 控制反转 谁控制谁?控制什么? IoC容器控制对象,控制依赖对象的创建与注入. 为什么称为反转?创建.注入对象的控制权由程序员的主观意愿转为IoC容器统一管理. 2. 传统方式构建对象间依赖关系 public class DvdPlayMissionImpossible { private MissionImpossibleCd missionImpossibleCd; public DvdPlayMissionImpossible

浅析Spring IOC、依赖注入(DI)和依赖查找(DL)

为什么要用IOC? 第一:对象的实例化不是一件简单的事情,比如对象的关系比较复杂,依赖关系往往需要程序员去维护,这是一件非常头疼的事. 第二:解耦,由容器去维护具体的对象 第三:托管了类的产生过程,比如我们需要在类的产生过程中做一些处理,最直接的例子就是代理,如果有容器程序可以把这部分过程交给容器,应用程序则无需去关心类是如何完成代理的 控制反转(Inverse of Control) 控制反转即IoC(Incersion of Control),从字面上理解就是控制反转,将对在自身对象中的一个

php+laravel依赖注入浅析

laravel容器包含控制反转和依赖注入,使用起来就是,先把对象bind好,需要时可以直接使用make来取就好. 通常我们的调用如下. $config = $container->make('config');$connection = new Connection($this->config); 比较好理解,这样的好处就是不用直接 new 一个实例了,方法传值没啥改变,还可以多处共享此实例. 但这跟依赖注入有什么关系,真正的依赖注入是不需给方法传递任何参数值,只需要指明方法参数类型,代码自动

laravel依赖注入浅析

laravel容器包含控制反转和依赖注入,使用起来就是,先把对象bind好,需要时可以直接使用make来取就好. 通常我们的调用如下. $config = $container->make('config');$connection = new Connection($this->config); 比较好理解,这样的好处就是不用直接 new 一个实例了,方法传值没啥改变,还可以多处共享此实例. 但这跟依赖注入有什么关系,真正的依赖注入是不需给方法传递任何参数值,只需要指明方法参数类型,代码自动