即使使用DI,我們的業務/服務類型也需要在其方法中創建一些傳遞對象。我會說這些傳遞對象始終是值類型(表示純數據)或I/O類型(表示外部狀態)。值類型可以更新,但我們希望在測試中模擬/存根的I/O類型,所以我們不能直接創建它們。如何在運行時使用依賴注入來創建I/O類型(例如文件)
我看到的通用解決方案是給類提供某種IOFactory依賴關係:在生產中,我們爲產生真正I/O對象的類提供了一個工廠;在測試中,我們爲產生假I/O對象的類提供了一個工廠。
我不喜歡這個,不僅需要創建模擬/存根I/O類型,還要爲實際類型和替代品創建工廠。這讓人感覺很累,特別是在像JS這樣的動態語言中,我經常可以輕鬆地爲每個測試創建我的模擬/存根(stub)。
發生對我來說是使用注射器有點像一個服務定位器的替代...
var file = injector.inject(File, '/path'); // given type, returns new instance of that type
......這樣,在生產,噴油器被配置爲提供一個真正的文件,而在測試中,它被配置爲返回一個模擬/存根。我們可以將注入器視爲一種特殊的全局注入,但可以說注入器現在是需要使用它的每種業務類型的依賴關係,因此它應該像任何其他依賴注入一樣。
我認爲贊成這個想法的主要觀點是,在許多情況下噴油器可以減少工廠樣板(以一些額外的工廠配置工作爲代價)。什麼是反對的論據?工廠是否更好,因爲它們是對類所需要的更具體的聲明,從而用作文檔?或者是完全不同的正確解決方案?
謝謝。我想我找到了答案:更好地讓類給出關於它們依賴關係的特定信息。抽象工廠並不完全具體,但它們比噴油器更具體。這可能對於由一個或兩個人編寫的單個程序中的代碼而言並不重要,但將該注入器用作服務定位器(即使只是針對I/O類型)對於該類的任何外部消費者來說都是可怕的。 – Jegschemesch
你說得對,這是一個語言問題:我真正想要的是創建樣板抽象工廠的簡便方法。 – Jegschemesch