Dot-Net
IoC.Resolve 與建構子注入
我聽到很多人說使用 IoC.Resolve() 是一種不好的做法,但我從來沒有聽到一個很好的理由(如果這完全是關於測試,那麼你可以只模擬容器,然後你就完成了)。
現在使用 Resolve 而不是 Constructor Injection 的優點是您不需要在建構子中創建具有 5 個參數的類,並且每當您要創建該類的實例時,您都不需要為其提供任何事物
IoC.Resolve<>是服務定位器模式的一個例子。該模式施加了一些建構子注入沒有的限制:
- 由於靜態呼叫,對像不能擁有比應用程序域更細粒度的上下文
- 對象決定要解決哪些版本的依賴關係。某個類的所有實例都將獲得相同的依賴配置。
- 將程式碼耦合到容器的誘惑很大,例如,而不是創建意圖揭示工廠。
- 單元測試需要容器配置,其中可以創建類並以其他方式使用。(由於上面的第二個問題,當您要測試同一類的多個配置時,這尤其麻煩。)
- 無法從其公共 API 推斷應用程序的結構。(建構子參數是個好東西。它們不是你應該覺得需要解決的問題。)
在我看來,這些限制將服務定位器模式降級為介於大泥球和依賴注入之間的中間地帶:如果你必須使用它,它很有用,但到目前為止還不是最好的選擇。