2008-11-19 62 views
3

.NET空間中的很多人拿起了溫莎城堡,並在他們的項目中實施它,在過去的一年中,我一直在努力弄清楚爲什麼IoC容器似乎被視爲一般的「最佳實踐」 ?我已經閱讀了很多關於溫莎等等的摘要和簡要解釋,但是其中的每一個都是抽象的,並且對於我所觸及的大多數項目來說似乎都不實用,但最近我一直遇到很多使用Windsor的項目,我不明白爲什麼。IoC容器適用性/情景演示?

C#/ .NET本質上支持基於接口的編碼,抽象對象,委託和事件。我們可以從核心語言實現IoC,並且使用Reflection等實例化實現已知接口的未知實例,而不訴諸IoC容器庫。

當應用YAGNI/AYGNI(你是否需要它?)我覺得溫莎已被過度使用。我當然可以看到IoC容器的好處,但我認爲這些好處是以額外的依賴性和元數據爲代價的(IoC容器特有的屬性和方法在覈心代碼中調用,.config文件在任何地方分散,app.config/web.config充滿了綁定標籤使得.config文件更難以編輯等),所以我試圖找出折衷。

這就是說,我正在接受這種可能性,我正在對這些意見/聲明做出全部所有關於無知的聲明,因爲我從未大量參與過使用Windsor或其他IoC容器庫的項目。我真正需要的是有人展示一個「平均」或「典型」項目,在這個項目中使用了一個IoC容器庫,爲什麼這應該是一個「最佳實踐」,對我來說,它似乎使一個乾淨的項目變得凌亂與依賴和元數據。

如果有人知道任何博客帖子,文章或書籍,將填補我,這將是非常棒的。 (我不爭論爭吵的緣故,但因爲我真的很想接受教育,是否應該讓我自己瞭解IoC容器)。

回答

2

好像你想要的答案this question

顯然,如果如你所說,那麼它不會是值錢,當你來到維護它的系統是很難建立。使用新技術時要記住這一點。有時舊的無聊的東西因爲這個因素而更好。

溫莎城堡使用反射本身,所以它真的是一個包裝,以你想要的方式做事。如果您可以開發比CW更易於使用的系統,那麼即使您在初始啓動時花費您的時間,也應該這樣做。這個成本將首先被CW的學習曲線所抵消,所以它不會像重新發明輪子那樣。

他們這樣做say themselves認爲國際奧委會不適合小項目,

另外,根據大小和 項目的複雜性,一個IoC容器 可能是矯枉過正。傾向於 在大中型項目中使用它。

2

這不是一個直接回答你的問題,因爲我不熟悉castle-windsor,而且我也不是IoC專家,但是從我對Java版Spring的經驗中我可以看出,在這裏,我們將討論Spring,所以它可能並不是Castle-windsor的情況) 它不僅僅是依賴注入部分,它使得它很棒,而且框架本身也是:聲明式事務管理,內置安全框架,ORM支持,內置的MVC Web框架,RMI,Web服務,電子郵件,AOP等等。它與IoC很好地集成在一起,在大多數典型場景中,fraework確實爲您做了很多工作。

自動裝配註釋+ IDE支持(例如IntelliJ IDEA for Spring)我認爲緩解了配置文件問題。

我不知道castle-windsor除了IoC容器外什麼都沒有,但如果是這樣的話,也許就它作爲框架的功能的豐富性而言,它還沒有。

1

我不一定相信IoC容器在所有情況下都是好的。但它絕對可以。如果您使用依賴注入或服務定位器來處理依賴關係,您仍然有很長的路要走,但IoC容器可以幫助自動執行任務,爲更高級的場景等提供支持。

我試圖定義它爲自己在博客中發佈了好一會兒前:

控制反轉(IOC)容器是一種非侵入性配置的智能工廠組件

拆分這個定義部分,我們得到

  • 工廠,因爲它負責爲您創建對象。

  • 智能,因爲它明白你有什麼依賴關係,並遞歸地爲你創建它們。

  • 可配置,因爲您可以通過代碼或配置文件配置使用情況。

  • 非侵入性,因爲使用的對象不需要知道容器。

    -

如果使用依賴注入或服務定位器模式你正確地使用它得到一些非常方便的好處。你不一定需要使用像Winsor這樣的外部容器,但是這確實會給你一些額外的好處。

您可以編寫實例化新對象的代碼少得多。如果您想到更復雜的對象層次結構,則IoC容器可以幫助您自動創建整個鏈。這可能非常強大。

在測試過程中,您可以輕鬆地在測試過程中輕鬆添加模擬版本的對象(如果使用DI和/或SL)。例如,爲自己創建一個服務定位器也可以解決這個問題。

更改要在注入構造函數中注入的依賴關係並不一定意味着您需要重構很多代碼。

您通過一個來源獲得隧道依賴的各種好處:裝飾器,攔截器,代理以及處理對象生活方式。有了這樣溫莎的容器,這使你做一些硬的東西很簡單,用極少的耦合

可以leviate其設施概念與例如NHibernate的

0

我建議你聽插曲順利整合2軟件工程電臺播客。這是一個關於依賴注入的整個情節。依賴注入是控制反轉框架最廣爲人知的用法。我也建議聽聽有John Kovacs的DotNetRocks插曲362。 Here是該節目的成績單。

現在IOC的副作用是提高可測試性。像溫莎城堡這樣的IOC容器的使用有助於解耦依賴。這種解耦使得單元測試更好。

大多數IOC框架還帶有促進面向方面編程的方法。所以,如果你進入IOC容器框架可以幫助你。