2016-10-04 40 views
5
  1. 什麼時候應該使用屬性注入?
  2. 如果在完全控制的情況下創建實例,我應該默認使用構造函數注入嗎?
  3. 我是否正確使用構造函數注入來編寫容器不可知的代碼?

回答

9

什麼時候應該使用屬性注入?

如果依賴關係是真正可選的,當您具有本地默認值或對象圖包含循環依賴關係時,您應該使用屬性注入。

然而,財產注入導致Temporal Coupling,並在編寫業務線應用程序時,您的依賴關係不應該是可選的:您應該改爲應用Null Object pattern

也不應該使用本地默認值,因爲這會使測試變得複雜,隱藏依賴性,並且使得忘記配置依賴關係變得非常容易。

對象圖也不應該具有循環依賴性。這是應用程序設計中的indication of a problem

我應該使用默認構造函數注入如果實例創建完全控制?

是的。建設者注入是最好的方法。它使得查看類的依賴關係變得非常容易,可以使依賴關係成爲必需,並防止時間耦合。

我說得對,使用構造函數注入我寫容器不可知的代碼?

這是正確的。構造器注入允許您延遲決定使用哪個DI庫,以及whether at all you use a DI library

針對上述情況,以及更多更詳細的解釋,讀這本書由Mark SeemannDependency Injection in .NET(和我),這是去到引導,當談到了解DI和它的基本模式和原則。

+0

屬性注入不應該與默認構造函數結合使用,所以它應該是通過DI容器構造對象的唯一方法。所以屬性注入也許可以用於當你有太多的依賴關係,你不想要一個很長的構造函數簽名:) – hB0

+0

@ hB0這實際上是非常糟糕的建議。如果你有一個帶有許多參數的構造函數,你的代碼告訴你,你違反了單責任原則。使用屬性不會解決根本問題:您的課程太大;它應該分成更小,更集中的班級。 – Steven

+0

你是對的,但它不是一個建議,但是在類已經混亂的情況下使用屬性注入的合理情況,否則使用構造函數注入總是更好。這是我評論但沒有回答的原因,因爲這不是一個好方法。 – hB0