Внедрение внутренних зависимостей с использованием Dagger2

Я хочу использовать Dagger2.

Скажем, у меня есть следующие зависимости:

  • Класс А зависит от класса В
  • Класс B зависит от класса C

Я попытался создать модуль, который предоставляет B и C, и компонент, который предоставляет A, однако только B вводится в A, а ссылка на C в B остается нулевой.

Какую структуру классов мне нужно реализовать с помощью кинжала?


person dors    schedule 21.08.2015    source источник


Ответы (1)


Вы можете использовать внедрение конструктора или внедрение поля; и либо конструктор-внедрение, либо модуль-внедрение.

Constructor-@Inject может содержать ошибки, потому что я использую модули и компоненты с незапамятных времен.

@Singleton
public class A {
    B b;

    @Inject
    public A(B b) {
        this.b = b;
    }
}

@Singleton
public class B {
    C c;

    @Inject
    public B(C c) {
        this.c = c;
    }
}

@Singleton
public class C {
    @Inject
    public C() {
    }
}

@Singleton
@Component
public interface SingletonComponent {
    void inject(MainActivity mainActivity);
}

Or

public class A {
    private B b;

    public A(B b) {
        this.b = b;
    }
}

public class B {
    private C c;

    public B(C c) {
        this.c = c;
    }
}

public class C {
}

@Module
public class ProviderModule {
    @Provides
    @Singleton
    public A a(B b) {
        return new A(b);
    }

    @Provides
    @Singleton
    public B b(C c) {
        return new B(c);
    }

    @Provides
    @Singleton
    public C c() {
        return new C();
    }
}

@Component(modules={ProviderModule.class})
@Singleton
public interface SingletonComponent {
    A a();
    B b();
    C c();

    void inject(MainActivity mainActivity);
}

или с инъекцией поля

@Singleton
public class A {
    @Inject
    B b;

    @Inject    
    public A() {
    }
}

@Singleton
public class B {
    @Inject
    C c;

    public B() {
    }
}

@Singleton
public class C {
    @Inject
    public C() {
    }
}

@Component
@Singleton
public interface SingletonComponent {
    A a();
    B b();
    C c();

    void inject(MainActivity mainActivity);
}
person EpicPandaForce    schedule 25.08.2015