2015-10-02 3 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; 
} 
} 

По инстанцированию Foo в моей деятельности с new Foo(), я знаю, что мой пользователь не будет введен.

Так что мой вопрос в том, что я должен обновить в своем коде, чтобы иметь возможность вводить объект Foo в свою деятельность (я думаю, что это способ сделать, если я хочу ввести пользователя в Foo, но скажите мне, неверно)?

Кроме того, где хорошее место для сборки моего компонента? Все в приложении?

Спасибо-х

ответ

1

У вас есть 4 варианта:

1. Используйте:

@Inject 
Foo mFoo; 

использовать этот подход, если жизненный цикл обув точно так же, как и жизненный цикл вашей деятельности.

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

Кроме того, где это хорошее место, чтобы построить свой компонент? Все в приложении ?

Для приложения для Android: да, обычно компонент построен там.

+0

Спасибо за ваш ответ, но что, если в конструкторе Foo я хочу получить свою активность, из которой я ввожу Foo? Я могу это сделать ? С чем-то вроде @Inject public Foo (активность MyActivity) {} –

+0

Это звучит как круговая зависимость, которая, вероятно, не очень хорошая идея. Почему бы просто не определить метод 'attach (Activity act)' и вызвать его после создания экземпляра 'Foo'? – Ognyan

+0

Да, это было просто знать, есть ли способ избежать прикрепления (Activity), но я сделаю это таким образом, спасибо –

Смежные вопросы