2012-01-15 93 views
4

我花了很多時間瞭解ioc。我從來不明白在這種模式下究竟是如何反向控制的。即使我對倒置的確切含義感到困惑。在正常的英語中,反轉有點像倒轉,比如倒轉一個杯子。控制反轉在哪裏控制

如果我認爲依賴注入作爲Ioc。我想知道在這裏倒轉的確切位置。我明白在這裏DI,依賴從與構造,二傳手的幫助外部實體插入........

但我從來不明白的地方的控制,這裏倒...

任何幫助讚賞。

+0

看到這個:http://stackoverflow.com/questions/5433211 /差異之間依賴注入和嘲弄框架ninject相對rhinom/5433231#5433231 – gideon 2012-01-15 08:34:54

回答

5

舊風格:

Class car 
{ 
    Engine _engine; 
    Public Car() 
    { 
     _engine = new V6(); 
    } 
} 

倒:

Class car 
{ 
    Engine _engine; 
    Public Car(Engine engine) 
    { 
     _engine = engine; 
    } 
} 

var car = new Car(new V4()); 

調用者的控制,而不是汽車類

2

依賴注入反向控制。

例如一個汽車類需要一個引擎類。發動機可以是任何類型的發動機。

如果你不使用DI,汽車類將決定引擎類型本身,汽車類是在控制之下。

當使用DI時,實例化汽車的代碼將確定汽車的類型(例如通過在構造函數中指定引擎),調用代碼現在處於控制狀態。控制從汽車類轉換爲調用代碼。

+0

謝謝,尼斯解釋。在你的最後一句話中(反轉從汽車類轉換爲調用代碼。)反轉和反轉的確切含義是什麼?是否「控制從汽車級轉換爲調用呼叫代碼」?在這種情況下,倒轉是有點像移動?我真的很困惑這個詞倒... – Brainchild 2012-01-15 08:40:02

+0

糟糕,應該控制而不是倒置。 – 2012-01-15 08:45:27

+0

控制什麼類型的引擎使用從汽車移動到調用代碼 – 2012-01-15 08:48:08

0

爲了擴大對羅賓的回答是:

IUserRepository _user = new UserRepository(); 
//you're in control of which instance is created. 

依賴注入:

IUserRepository _user;// you will not do anything else. 

基於配置的其他地方,你可以使用依賴注入框架將創建的護理實例爲你。這是控制從您的代碼反轉。您不是直接從您的代碼創建任何實例。

爲什麼?你爲什麼要這樣做?

一個主要優勢是測試,當您運行測試時,您可以配置您的IUserRepository假的。