依赖注入 (Dependency Injection,DI)

December 13, 2013

用国外一位老兄的话说,5分钱的东西,取了一个25美元的名字。

其实很简单,当一个对象依赖另外一个对象的时候,不自己创建,也不调用工厂创建。而是把它当做构造函数的参数,或者通过setter传进来。换句话说,就是把麻烦抛给别人。

//你不这么做
public class Person {
   //arm = new Arm();
   arm = Factory.getArm();
}

//你这么做
public class Person {
    public Person(Arm a) {
        this.arm = a;  
    }

    /*
    public void SetArm(Arm a) {
         this.arm = a;
    }
    */
}

更加实际一点的案例。你的网站需要返回图书列表,需要通过一个数据库连接来获取。

//依赖注入的方式
m.Get("/booklist", func(db DB) string {
    return db.getBookList().String()
})

//自己创建的方式
m.Get("/booklist", func() string {
    db = new DB(url, port, usr, password)
    return db.getBookList().String()
})

依赖注入还有一个250美元的名字——依赖反转。其实也一样,本来是自上而下的依赖关系,越上层的组件对下层越是依赖严重。现在是不依赖下层了,而是依赖一个控制中心。

延伸阅读:

1、http://stackoverflow.com/questions/130794/what-is-dependency-injection

2、http://tutorials.jenkov.com/dependency-injection/index.html

· EOF ·