zoukankan      html  css  js  c++  java
  • 浅析依赖注入

          菜鸟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
    这篇文章比较深,但是不难理解,而且是层次递进,读起来也很容易。

  • 相关阅读:
    SP笔记:交叉实现七行并成一行
    HTML tag 学习
    操作哈希表
    Efficient bipedal robots based on passivedynamic walkers
    Pushing People Around
    ZEROMOMENT PONTTHIRTY FIVE YEARS OF ITS LIFE

    Active Learning for RealTime Motion Controllers
    Accelerometerbased User Interfaces for the Control of a Physically Simulated Character
    Dynamic Response for Motion Capture Animation
  • 原文地址:https://www.cnblogs.com/cnDqf/p/4093271.html
Copyright © 2011-2022 走看看