Введите поле класса, который создается перед компонентом кинжала - PullRequest
0 голосов
/ 25 августа 2018

У меня есть класс A с полем private SomeValue someValue. Мой Кинжал @Component класс называется MyApplicationComponent.

Класс A создается до DaggerMyApplicationComponent. Поэтому я не знаю, как вводить someValue.

Я не могу использовать конструктор, потому что A создан до компонента.

Я считаю, что я также не могу использовать инъекцию поля, потому что в A мне нужно было бы позвонить MyApplicationComponent.inject(this), но в A я понятия не имею, когда будет создан экземпляр MyApplicationComponent, поэтому я не знаю, когда позвонить .inject.

Я попытался использовать сеттерную инъекцию, добавив этот метод к A:

@Inject
public void setSomeValue(SomeValue someValue) {
    log.info("in setter injector!");
    this.someValue = someValue;
}

Кроме того, я добавил это к MyApplicationComponent:

void inject(A a);

Однако метод установки никогда не вызывается.

Почему этот метод не вызывается?

Как Dagger делает сеттерную инъекцию?

Есть ли какой-нибудь способ сказать Кинжалу ввести someValue в A после создания экземпляра DaggerMyApplicationComponent?

1 Ответ

0 голосов
/ 27 августа 2018

При внедрении метода, когда создаются экземпляры объектов, кинжал вызывает методы, аннотированные аннотацией @inject, один раз. что означает, что это не то, что вам нужно. Вы можете определить общий интерфейс, который расширяет его интерфейс компонента (MyApplicationComponent).

interface Injector<T> {
    void inject(T instance);
}


public interface MyApplicationComponent extends Injector<A>{

    MyApplicationComponent getMyApplicationComponent();

    void inject(A instance);
}

Затем создайте метод в вашем классе, например:

public class A {


    private SomeValue someValue

    public void setSomeValue(Injector<A> com) {
       com.inject(this);
    }
}

Наконец, когда ваш компонент создан, вызовите метод setSomeValue и передайте ему объект компонента.

A obj=new A();

MyApplicationComponent component=DaggerMyApplicationComponent.create();

obj.setSomeValue(component);
...