2016-09-17 111 views
1

我想在我的項目中使用匕首2。 Dagger提供了創建單例的好方法,我在我的項目中有一些,但Dagger爲每個@Singleton對象的每個新容器創建一個新的對象圖,所以我們必須在應用程序級創建組件,因此我們應該提供應用程序給使用單身人士的類,這看起來不是很好:(。 問題是:我應該保留我的舊單身?或應該使用匕首?匕首2 Singleton vs Real Singleton

回答

1

匕首是一個更好的方式來管理單身人士,部分原因是你不必擔心在單元測試中如何替換這些單例:你的單例將通過意味着你可以在單元測試(即構造函數參數和可訪問字段)中進行控制和重寫的方式來注入。

匕首創建@Singleton對象,以便我們在應用層面創建組件爲每個每個新容器的新對象圖

如果你想要的應用程序級單身,你會希望保持應用程序生命週期中的相同組件實例,而不是爲每個新「容器」創建一個新實例。該組件將包含並提供單例,因此您不應該在應用程序中需要多個活動的對象圖。如果某個外部創建者(例如Android或servlet引擎)在Dagger之外創建對象,這可能意味着您需要將Dagger組件保存在單例持有者(可能是線程安全的公共靜態字段)中,爲你的老單身人士做過;這應該仍然更容易理解和維護,因爲您可以通過Dagger提供儘可能多的單例,並且只需要擔心組件本身的一個外部管理的單例。

作爲一種替代方法,您可以將您的舊單例完全保留爲您的單例,並在模塊中編寫@Provides方法以在您的Dagger創建的對象請求它們時檢索這些單例實例。這將允許您隨時隨地創建一個新的對象圖,並且您的單身人員仍將表現爲單身人士。不過,我會提醒你不要這樣做,因爲在那時你的單身人士可以在你的應用程序中以兩種不同的方式訪問,而且只有那些由Dagger創建或者Dagger管理的單身人士在測試中很容易被覆蓋;這可能會令人困惑和難以管理。