2011-12-31 48 views
2

我經常在我閱讀的AS3書中看到術語「依賴注入」。但是,它沒有解釋到底是什麼。任何人都可以展示什麼是使用一些AS3.0代碼行?使用「依賴注入」是什麼意思?任何AS3代碼示例展示?

感謝 Vishwas

+1

這篇文章演示了在php中的概念,但它仍然是一個很好的基礎:http://fabien.potencier.org/article/11/what-is-dependency-injection – 2011-12-31 15:45:23

回答

8

依賴注入只是意味着不是類的決定哪些對象是爲了正常工作需要它從外面通過這些對象。

在正常的發展,我們的對象決定自己的班級具體地說,就像這樣:

public class MyClass 
{ 
    private var m_someObj:SomeObj = null; 

    public function MyClass() 
    { 
     this.m_someObj = new SomeObj; 
    } 
} 

移動到依賴注入,MyClass現在得到來自外部的依賴關係:

public class MyClass 
{ 
    private var m_someObj:SomeObj = null; 

    public function MyClass(obj:SomeObj):void 
    { 
     this.m_someObj = obj; 
    } 
} 

var myClass:MyClass = new MyClass(new SomeObj); 

在這個例子中,我們在構建MyClass時傳入SomeObj類。你也可以使用公共變量/屬性。通過構造函數傳遞對象對重要的依賴關係很有用。

現在爲了使其具有實際意義,我們可以使用接口而不是具體的類。這讓我們改變MyClass行爲很容易:

public interface ISomeObj 
{ 
} 

public class SomeObjImplA implements ISomeObj 
{ 
} 

public class SomeObjImplB implements ISomeObj 
{ 
} 

public class MyClass 
{ 
    private var m_someObj:ISomeObj = null; 

    public function MyClass(obj:ISomeObj):void 
    { 
     this.m_someObj = obj; 
    } 
} 

var myClass1:MyClass = new MyClass(new SomeObjImplA); 
var myClass2:MyClass = new MyClass(new SomeObjImplB); 

給你舉一個例子,ISomeObj接口可以描述一個渲染器。類將使用正常的addChild()技術渲染,而SomeObjImplB類將使用blitting渲染。現在,只需更改一個參數即可更改呈現MyClass對象的方式 - MyClass類不需要知道它是否正常呈現或通過blitting呈現。

決定傳遞給MyClass的類別的對象是所謂的注入器。它如何決定要注入哪一類是你獲得靈活性的地方。例如,您可以加載一個包含要注入的類的XML對象,或使用反射,這就是Robotlegs我認爲的工作方式。

32bitkid發佈的鏈接是對原理的很好的解釋,但這是它的要點。您也可以查看wiki page。對於獎勵積分,請閱讀Inversion of Control,這有點相關。

+0

使用界面來使用不同類別的函數(在擴展它們的類的形式)是接口的主要目的之一。那麼我想知道爲什麼這種行爲被特別稱爲「依賴注入」,因爲正如你所提到的那樣,它通常是通過接口完成的。 – 2012-01-01 05:58:52

+0

實際的「依賴注入」是將依賴關係傳遞給一個類。接口只是使這種模式特別有用 – divillysausages 2012-01-01 13:37:51