본문 바로가기

Android

[Dagger2] Multi Binding(2)

SubComponent

컴포넌트로 부터 멀티 바인드 된 Set 또는 Map을 SubComponent도 그대로 물려받을 수 있습니다.

 

@Component(modules = ParentModule.class)
public interface ParentComponent {
    Set<String> strings();
    ChildBuilderComponent.Builder childCompBuilder();
    ChildFactoryComponent.Factory childCompFactory();
}
@Module(subcomponents = ChildBuilderComponent.class)
public class ParentModule {
    @Provides
    @IntoSet
    String string1() {
        return "parent string 1";
    }

    @Provides
    @IntoSet
    String string2() {
        return "parent string 2";
    }
}

부모 Component와 부모 Module을 만듭니다.

 

@Module
public class ChildModule {
    @Provides
    @IntoSet
    String string3() {
        return "child string 1";
    }

    @Provides
    @IntoSet
    String string4() {
        return "child string 2";
    }
}

ChildModule을 생성합니다.

@Subcomponent(modules = ChildModule.class)
public interface ChildBuilderComponent {
    Set<String> strings();

    @Subcomponent.Builder
    interface Builder {
        ChildBuilderComponent build();
    }
}
@Subcomponent(modules = ChildModule.class)
public interface ChildFactoryComponent {
    Set<String> strings();

    @Subcomponent.Factory
    interface Factory {
        ChildFactoryComponent newChildFactoryComponent();
    }
}

Builder 패턴 혹은 Factory 패턴으로 ChildComponent를 구성합니다.

 

그리고나서 테스트를 해봅니다.

private void testDaggerBuilder() {
    ParentComponent parentComponent = DaggerParentComponent.create();
    ChildBuilderComponent childBuilderComponent = parentComponent.childCompBuilder().build();

    Log.d(TAG, "List set in Parent");
    for (String str : parentComponent.strings()) {
        Log.d(TAG, str);
    }

    Log.d(TAG, "List set in Child");
    for (String str : childBuilderComponent.strings()) {
        Log.d(TAG, str);
    }
}
private void testDaggerFactory() {
    ParentComponent parentComponent = DaggerParentComponent.create();
    ChildFactoryComponent childFactoryComponent = parentComponent.childCompFactory().newChildFactoryComponent();

    Log.d(TAG, "List set in Parent");
    for (String str : parentComponent.strings()) {
        Log.d(TAG, str);
    }

    Log.d(TAG, "List set in Child");
    for (String str : childFactoryComponent.strings()) {
        Log.d(TAG, str);
    }
}

 

D/test_dagger: List set in Parent
D/test_dagger: parent string 1
D/test_dagger: parent string 2
D/test_dagger: List set in Child
D/test_dagger: child string 2
D/test_dagger: child string 1
D/test_dagger: parent string 1
D/test_dagger: parent string 2

테스트 결과 자식 Component가 부모 Component를 상속받아 부모 Component로 부터 Multi binding된 의존성을 그대로 물려받는것을 확인할 수 있습니다. 

 

Reference

옥수환, 아키텍처를 알아야 앱 개발이 보인다., 비제이퍼블릭(2020)

'Android' 카테고리의 다른 글

[Dagger2] Assisted Injection  (0) 2021.05.10
[Dagger2] Multi Binding(3)  (0) 2021.05.03
[Dagger2] Multi Binding(1)  (0) 2021.05.02