2009-10-29 113 views
8

我在我的代碼中使用依賴注入(與Ninject),並認爲我做得相當不錯,直到遇到由於誤解DI容器適合代碼的位置而導致的性能問題。似乎有很多關於如何使用DI框架的信息,但沒有太多關於不使用它們的地方或如何最好地使用它們(至少我能找到)依賴注入最佳實踐

我想我會寫出我想到的是一些最佳實踐,並看看其他人是否同意我的觀點以及人們可以提出哪些其他最佳實踐。每個應用程序或應用程序域

  • 使用一個內核
  • 使用長壽命辛格爾頓的DI容器對象只,使用工廠(或其他方式)進行短暫的臨時對象)
  • 青睞構造方法注入了物業或現場注入
  • 請求對象,不建立它們
  • 其他??指向好的博客條目/文章?
+0

什麼是內核?是一個Ninject特定的概念(在其他地方還沒有見過)? – zvolkov 2009-11-03 02:08:45

+0

此外,二傳手與構造器注射是一種宗教論點,因此應該避免。 – zvolkov 2009-11-03 02:11:54

回答

7

這裏是最重要的點的名單(其中一些也出現在OP):

  • 代碼應該是不知道哪些DI容器(如果有的話)用於
  • 撰寫在應用程序的根整個應用程序(構圖根)
  • 青睞構造器注入

我不能說,我同意你的觀點關於Singleton與瞬態對象。 DI的重點在於外部機制(如DI容器)決定任何給定依賴關係的生命週期,而不是其他人,因此您需要擁有DI容器管理的所有依賴關係。

+0

Hi Mark,請參閱此處的討論(http://groups.google.com/group/ninject/browse_thread/thread/41ec03527da9f0f8),瞭解Ninject在應用程序中的性能。和你一樣,我認爲應該在任何地方都使用DI容器,但DI容器的開銷是這樣的,即創建大量的瞬態對象可能是突兀的。您的建議對於Web應用程序來說可能很好,但對其他領域來說則不是那麼重要 – 2009-10-29 17:57:55

+0

我撇開了這個討論,但我想我贊同Nate那裏。應該使用DI來解決和注入依賴關係,但是如果通過DI容器創建數十萬個對象,那麼總體設計會出現問題。這絕不是DI的意圖。我可以在列表中添加另一個項目符號:「支持將穩定依賴關係中的易失性依賴關係解耦」,但這更像是一個通用設計建議,而不是特定的DI事務。 – 2009-10-29 19:54:21

+2

我同意關於瞬態對象 - 大多數使用DI的應用程序會創建大量的瞬態對象。一些容器(Unity和即將Autofac 2)默認爲瞬態而不是Singleton。 我不認爲「更喜歡單身人士」可能被視爲最佳實踐 - 它似乎更像是對特定場景中特定容器性能的評論。 – 2009-10-30 04:38:03

4

使用DI容器長住辛格爾頓只對象,請使用工廠(或其他方式)進行短暫的臨時對象)

但不要使用DI注入工廠到那裏需要。