2013-03-18 102 views
14

我試圖理解像StructureMap這樣的IoC框架的使用,但我不禁認爲這些「設計模式」只是無稽之談,使代碼變得更加複雜。MVC應用程序中IoC框架的用途是什麼?

讓我從一個例子開始,我認爲IoC有點有用。

我認爲在處理MVC框架中控制器類的實例時,IoC可能是有用的。在這種情況下,我正在考慮.NET MVC框架。

通常,控制器類的實例化由框架處理。所以這意味着你不能將任何參數傳遞給控制器​​類的構造函數。 這是IoC框架可以派上用場的地方。在IoC容器的某個地方,您可以指定應該實例化哪個類,並在調用控制器類時將其傳遞給控制器​​constructor

當你想單元測試控制器時,這也很方便,因爲你可以模擬傳遞給它的對象。

但就像我說的,我可以理解爲什麼人們想要將它用於他們的控制器類。但除此之外。從那裏你可以簡單地做正常依賴注入

但是,爲什麼不乾脆像這樣做:

public class SomeController 
{ 
    public SomeController() : this(new SomeObj()) 
    { 
    } 

    publiv SomeController(SomeObj obj) 
    { 
     this.obj = obj; 
    } 
} 

現在你不必使用任何第三方IoC框架這也意味着較低的學習曲線。因爲你不必進入該框架的規格。

您仍然可以在單元測試中模擬對象。所以在那裏也沒有問題。

你唯一可以說的是,「但是現在你的班級是緊密耦合SomeObj」。 這是真的。但誰在乎!?這是一個控制器類!我永遠不會重複使用這個類。那麼爲什麼我要擔心這種緊密的耦合......?我可以嘲笑傳遞給它的對象。這是唯一重要的事情。

那麼,爲什麼我應該打擾使用IoC?我真的錯過了點...?對我來說,IoC模式只是一些被高估的模式。將更多,更復雜的圖層添加到您的應用程序中...

+0

@HenkHolterman不一定當有人來與一個很好的論點,爲什麼我的做法是錯誤的,在什麼樣的情況。我不打算與任何人爭論。只是在這個問題上尋找建議。 – w00 2013-03-18 16:06:05

+3

[爲什麼需要IoC容器而不是簡單的DI代碼?](http://stackoverflow.com/questions/871405/why-do-i-need-an-ioc-container-as-opposed -to-直截了當二 - 代碼) – 2013-03-18 16:07:21

回答

8

你問一個很好的問題,在你的榜樣,我會說一個IoC會/可能是矯枉過正,但只要將您的代碼擴展到以下範圍,然後您就可以開始看到讓IoC爲您完成這些工作的好處。

public class SomeController 
{ 
    public SomeController() : this(new SomeObj(new configuration(), new SomethingElse(new SomethingElseToo()))) 
    { 
    } 

    publiv SomeController(SomeObj obj) 
    { 
     this.obj = obj; 
    } 
} 
4

IoC容器可以爲您執行多種操作。

顯而易見的是爲依賴關係提供實現,這在其他地方是有意義的,而不僅僅是在控制器中 - 如果您決定用SomeObj2替換SomeObj,則只能在一個地方而不是57個地方執行。

另一個是處理生命週期問題,即可以指定對象的範圍(單例,每線程,每請求,瞬變...)。

此外,IoC容器可以設置您的可選依賴關係(即,物業注射),這比寫這個簡單:

var svc = new Service(new MyRepository()) 
svc.Logger = logger; 
svc.XY = xy 

,所有這裏所述的理由:Why do I need an IoC container as opposed to straightforward DI code?

2

但誰在乎!?這是一個控制器類!我不打算重用 類,永遠..

這是一個很好的點,而是考慮如何清潔器的代碼,如果你有嵌套的相關,不同的生命週期。例如,您可以擁有一些應用程序級別的單例,這需要「按請求」等等。 IoC使您的代碼更清晰,並且易於修改。

相關問題