Dagger2注入子对象

时间:2015-10-02 08:01:33

标签: android dependency-injection dagger dagger-2

不确定标题是否清楚但我实际拥有的是:

模块:

@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);
}

在我的App中我创建了这样的组件:

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

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

现在在我的Activity中,如果我创建一个Object Foo,它看起来像这样:

public class Foo {

@Inject
User user;

MyActivity activity;

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

通过new Foo()在我的活动中实例化Foo,我知道我的用户不会被注入。

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

此外,构建组件的好地方在哪里? App中的一切??

谢谢

1 个答案:

答案 0 :(得分:2)

您有4种选择:

<强> 1。使用

@Inject
Foo mFoo;

如果foo的生命周期与您活动的生命周期完全相同,请使用此方法。

<强> 2。使用Lazy

@Inject
Lazy<Foo> mLazyFoo;

然后当您需要Foo的实例时:

Foo myFoo = mLazyFoo.get();

如果您在活动的整个生命周期中只需要一个Foo,请使用此方法。

第3。使用Provider

@Inject
Provider<Foo> mFooProvider;

当您需要实例Foo

Foo myFooFirstInstance = mFooProvider.get();

如果您的活动中需要多个Foo个实例,请使用此方法。

<强> 4。手动注入你的foo(不推荐):

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

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

此外,构建组件的好地方在哪里?一切都在   App ??

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