首頁  >  問答  >  主體

angular.js - 如何簡單易懂的解釋「依賴注入」?

如何簡單易懂的解釋「依賴注入」?另外,依賴注入和控制反轉有差別嗎?具體是什麼差別?

ringa_leeringa_lee2737 天前938

全部回覆(7)我來回復

  • 黄舟

    黄舟2017-05-15 17:06:27

    已經寫好的東西 拿來即用!

    回覆
    0
  • 世界只因有你

    世界只因有你2017-05-15 17:06:27

    首先 什麼叫依賴? 一個物件依賴與其他物件依賴var d=new Date();就是d依賴Date物件建立
    第二 依不依賴比較好? no 為了實現程式的低耦合,盡量減少各元件之間的相互依賴和限制比較好,例如一個建構函數,別人已經創建好了,我不用再創建就可以直接呼叫。
    第三 什麼叫注入?意思我現在用的物件是別人給的,是被動創建的。如

    angular.module('M1',['ng','ngRoute'])
    .controller('C1',function($scope,$http){
        $scope.data = 999;
        $http.get().success();    
    })
    这段代码运行时:只需要传入所需要的模块的名称,ng底层自动创建相关的对象,直接使用

    回覆
    0
  • 阿神

    阿神2017-05-15 17:06:27

    沒有差別,只是角度不同,所指的都是同一件事。簡單來說,不需要自己創造對象,spring幫你將對象放到你需要的地方

    回覆
    0
  • 滿天的星座

    滿天的星座2017-05-15 17:06:27

    都是工廠模式的昇華罷了。
    依賴注入和控制反轉程式碼原理時一回事,無非是理解上的不同而已。

    這些名詞實在是太高級了,其實無非是面向對象的一些基礎應用而已,把很多朋友糊弄住了。
    這與策略模式和工廠模式一個樣。

    回覆
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-15 17:06:27

    可參考下:http://www.nowcoder.com/questionTerminal/3be16186465a453f876729acd2e46ddf

    回覆
    0
  • 我想大声告诉你

    我想大声告诉你2017-05-15 17:06:27

    依賴注入和控制反轉本質上沒有區別, 只是對問題描述的角度不同。

    控制反轉:
    到底是什麼東西被反轉了呢? 維基百科的定義是依賴對象的獲得被反轉了。
    應用程式一般都是由很多個物件組成的。一個類別中需要用到很多其他的類,最初我們是自己主動透過new關鍵字取得其他類別的實例。這樣就帶來一個問題:各個類別的呼叫關係耦合了。

    有了控制反轉之後, 我們只要被動地等待spring將類別的實例注入給我們, 我們就可以直接使用了。

    這樣有諸多好處, 物件集中管理, 不用自己實作很多單例, 解耦類別的呼叫關係等等。

    假設有2個類 A和B, 如果A中使用了new B()這樣的語句, 那就添加一條從B到A的有向邊。龐大一點的工程可能擁有上千個類, 這樣構成的有向圖必定會異常複雜。如果用了控制反轉, 在最極端的情況下, 我們所有的類別都會變成獨立的點。

    因為擁有了各個bean的控制權, 所以還能衍生出各種強大的功能。
    spring就是建立在IoC和AOP的基礎上的。

    回覆
    0
  • 迷茫

    迷茫2017-05-15 17:06:27

    有個資料庫類別db,它有一個靜態方法get_db()能取得資料庫連線物件.
    另外有一個需要操作資料庫的類別post,它有個方法get_post()需要查詢資料庫.
    因為資料庫連線是公共操作,類別post不想在自己內部又去連接一次資料庫,避免耦合.
    所以post這個類別內部提供了一個set_db()的方法來取得資料庫連接物件.
    db::get_db()作為post類別的set_db()這個方法的參數傳到post類別內部,這就是依賴注入.

    <?php
    class db {
        public static function get_db() {
            return new mysqli('127.0.0.1','user','pass','dbname',3306);
        }
    }
    class post {
        private $db;
        public function set_db($db){
            $this->db = $db;
        }
        public function get_post($id){
            return $this->db->query('SELECT * FROM post WHERE id ='.intval($id));
        }
    }
    $post = new post();
    $post->set_db( db::get_db() ); //注入post类依赖的数据库连接对象
    var_export( $post->get_post(1024) );

    對比下面的寫法,可以體會下依賴注入其實是給完全OOP的某些語言打補丁.

    <?php
    function db() {
        static $db;
        if ($db) {
            return $db;
        } else {
            $db = new mysqli('127.0.0.1','user','pass','dbname',3306);
            return $db;
        }
    }
    function get_post($id) {
        $db = db();
        return $db->query('SELECT * FROM post WHERE id ='.intval($id))->fetch_all();
    }

    回覆
    0
  • 取消回覆