2016-02-24 44 views
0

只需在Android應用程序中試用Dagger 2,我覺得可能有更簡單的解決方案來實現我的目標。對於Dagger 2,從其他模塊訪問1模塊內的實例的最佳方式是什麼?

我有2個模塊:

  • ApplicationModule其中顧名思義其生命週期是依賴於整個應用程序。

  • UserModule每當用戶登錄被創建。

現在說我有一個是在ApplicationModule創造了單Prefs實例,但我需要訪問它的類UserModule內,什麼是最好的方式去做這件事?目前我正在ApplicationModule中創建它,然後在創建時將它傳遞給UserModule的構造函數。有沒有辦法避免這樣做,讓匕首爲我管理這件事?

@Module 
public class ApplicationModule { 
    @Provides 
    @Singleton 
    public Prefs prefs() { 
     return new Prefs(); 
    } 
} 

@Singleton 
@Component(modules={ApplicationModule.class}) 
public interface ApplicationComponent { 
    Prefs providePrefs(); 
} 

@Module 
public class UserModule { 
    private Prefs prefs; 

    public UserModule(Prefs prefs) { 
     // Anyway to avoid having to do this? 
     this.prefs = prefs; 
    } 

    @Provides 
    @UserScope 
    public UserService userService() { 
     // Possible to get the prefs from the ApplicationComponent? 
     return new UserService(this.prefs); 
    } 
} 

@Component(dependencies = {ApplicationComponent.class}, modules = {UserModule.class}) 
@UserScope 
public interface UserComponent extends ApplicationComponent { 
    UserService provideUserService(); 
} 

回答

2

匕首的整點是讓它爲你解決依賴關係。您不需要將任何內容傳入模塊,這不是直接需要的,就像用戶模塊的實際用戶一樣。

依賴將由匕首解決。你的情況,這意味着適合你這樣的代碼:

@Module 
public class UserModule { 

    public UserModule() { 
     // way of avoiding this code ;) 
    } 

    @Provides 
    @UserScope 
    public UserService userService(Prefs prefs) { 
     return new UserService(prefs); 
    } 
} 

這樣匕首將提供相關性的方法。你不必親自去做。

這個工作的先決條件是實際上可以提供依賴關係。在你的情況下,Prefs由應用程序組件提供。只要您實例化一個@Subcomponent或您的案例依賴@Component與暴露的依賴項,它將在您的應用程序組件中工作— Prefs providePrefs()方法。

如果提供依賴項的模塊位於同一個組件中,這也可以工作。


如果您UserService取決於沒有別的,你甚至可以考慮刪除整個模塊,因爲它看起來像它可以通過構造函數注入來提供。

@UserScope 
public class UserService { 

    Prefs prefs; 

    @Inject 
    public UserService(Prefs prefs) { 
     this.prefs = prefs; 
    } 
} 
+0

謝謝你的迴應大衛,這些例子很有幫助。我確實有一個困惑,如果我像在示例中那樣刪除UserModule構造函數中的參數,UserService是否會在創建UserModule之前創建?既然UserService現在已經實現了它的依賴關係,如果是這樣的話,甚至可以將UserService放在UserModule內強制執行任何操作? – Mike

+0

@Mike你需要一個UserModule來創建你的組件,所以它會在之前創建。這應該不會有影響。模塊只是提供依賴關係,如果他們不能由匕首本身創建 –

+0

明白了,謝謝你的解釋! – Mike

相關問題