2016-03-04 69 views
2

我有這個模塊:如何將活動注入到正在注入活動的對象?

@Module 
public class UserProfileModule { 

    @Provides 
    @Singleton 
    UserProfileController providesUserProfileController() { 
     return new UserProfileController(); 
    } 

} 

和這個組件:

@Component(modules = {UserProfileModule.class}) 
@Singleton 
public interface AppComponent { 

    void inject(UserProfileActivity activity); 

} 

到目前爲止,我UserProfileActivity我可以@InjectUserProfileController。但現在,我需要將UserProfileActivity注入控制器。我的意思是,互相注入。

我可以通過調用UserProfileController setter UserProfileActivitysetActivity(this);來做到這一點,但是如果它可以自動的話會更好。

這怎麼能實現呢?

謝謝。

回答

2

對於初學者:將其添加到構造函數。然後聲明該依賴關係。

@Provides 
@Singleton 
UserProfileController providesUserProfileController(UserProfileActivity activity) { 
    return new UserProfileController(activity); 
} 

這樣做匕首後會抱怨不能夠提供UserProfileActivity除非你已經這樣做。如果您不這樣做,請添加另一個模塊,或者僅提供來自同一模塊的依賴項。實際的實現如下,首先我們需要修復你的代碼。

@Singleton是依賴top的層次結構。您不能—或至少不應該 —對@Singleton帶註釋的對象具有活動依賴性,因爲這可能會導致不良的氣味和/或內存泄漏。引入一個自定義範圍@PerActivity,用於您的活動壽命內的依賴關係。

@Scope 
@Retention(RUNTIME) 
public @interface PerActivity {} 

這將允許正確的對象範圍。 也請參考一些關於匕首的教程,因爲這是一個非常重要的問題,並且在單個答案中涵蓋所有內容都會太多。例如Tasting dagger 2 on android

下通過擴展模塊使用的上述2輪選擇後一種方式:

@Module 
public class UserProfileModule { 

    private final UserProfileActivity mActivity; 

    public UserProfileModule(UserProfileActivity activity) { 
     mActivity = activity; 
    } 

    @Provides 
    @PerActivity 
    UserProfileActivity provideActivity() { 
     return mActivity; 
    } 

    @Provides // as before 
    @PerActivity 
    UserProfileController providesUserProfileController(UserProfileActivity activity) { 
     return new UserProfileController(activity); 
    } 

} 

如果你現在使用的組件Builder您可以創建模塊的新實例活動作爲論據。依賴關係將被正確提供。