2015-10-02 126 views
1

不知道标题是明确的,但我实际上已经是:Dagger2注射到子对象

模块:

@Module 
public class TestUserModule { 

    User user; 

    public TestUserModule(User user) { 
     this.user = user; 
    } 

    @Provides 
    @Singleton 
    public User providesUser() { 
     return user; 
    } 
} 

组件:

@Singleton 
@Component(modules = {TestUserModule.class}) 
public interface UserComponent { 

    void inject(MyActivity activity); 
    void inject(MyActivity2 activity); 
} 
在我的应用程序

我创建组件像这样:

userComponent = DaggerUserComponent.builder().testUserModule(new TestUserModule(user)).build(); 

因此,在我的活动中一切正常,我可以使用@Inject User user;它工作正常。

现在在我的活动,如果我创建一个对象foo,它看起来像这样:

public class Foo { 

@Inject 
User user; 

MyActivity activity; 

public Foo(MyActivity activity){ 
this.activity = activity; 
} 
} 

通过我与new Foo()活动实例富,我知道我的用户将不会被注入。

所以我的问题是,我必须在我的代码中更新以便能够在我的活动中注入Foo对象(我认为这是如果我想在Foo中注入User但要告诉我“米错了)?

另外,哪里是构建我的组件的好地方?在应用程序中的一切??

感谢的

回答

1

您有4种选择:

1.使用:

@Inject 
Foo mFoo; 

使用此方法,如果富的生命周期是完全一样的活动的生命周期。

2.使用Lazy

@Inject 
Lazy<Foo> mLazyFoo; 

,然后当你需要的Foo实例:

Foo myFoo = mLazyFoo.get(); 

使用此方法,如果你只需要一个富的整个生命周期活动。

3.使用Provider

@Inject 
Provider<Foo> mFooProvider; 

,当你需要实例Foo

Foo myFooFirstInstance = mFooProvider.get(); 

使用此方法时,你需要在你的活动Foo多个实例的实例。

4。手动注入你富(不推荐):

在你UserComponent声明void inject(Foo foo),然后在你的方法:

Foo myFoo = new Foo(...); 
userComponent.inject(myFoo); 

而且,当是建立我的组件的好地方?一切在 应用程序??

对于android应用程序:是的,通常组件是在那里构建的。

+0

感谢您的回答,但是如果在Foo的构造函数中我想从我注入Foo中获得我的活动呢?我可以这样做吗? 像@Inject public Foo(MyActivity activity){} –

+0

这听起来像循环依赖,这可能不是一个好主意。为什么不定义方法'attach(Activity act)'并在实例化一个'Foo'后调用它? – Ognyan

+0

是的,它只是知道是否有办法避免附加(活动),但我会这样做,谢谢 –