Android 上的 @Module.subcomponents

Flo*_*her 6 java android dependency-injection dagger dagger-2

我有 1 个应用程序和 1 个活动、1 个父组件和 1 个子组件的以下(简化)设置:

应用

public class ExampleApp extends Application {
    private AppComponent component;

    @Override
    public void onCreate() {
        super.onCreate();

        component = DaggerAppComponent.create();
    }

    public AppComponent getAppComponent() {
        return component;
    }
}
Run Code Online (Sandbox Code Playgroud)

应用组件

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {

    ActivityComponent.Builder getActivityComponentBuilder();
}
Run Code Online (Sandbox Code Playgroud)

活动子组件

@PerActivity
@Subcomponent(modules = {ActivityModule1.class, ActivityModule2.class})
public interface ActivityComponent {

    void inject(MainActivity mainActivity);


    @Subcomponent.Builder
    interface Builder {

        @BindsInstance
        Builder binding1(@Named("binding1") int binding1);

        @BindsInstance
        Builder binding2(@Named("binding2") int binding2);

        ActivityComponent build();
    }
}
Run Code Online (Sandbox Code Playgroud)

主要活动

public class MainActivity extends AppCompatActivity {
    @Inject
    TheObjectIWant theObjectIWant1, theObjectIWant2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ActivityComponent component = ((ExampleApp) getApplication()).getAppComponent()
                .getActivityComponentBuilder()
                .binding1(100)
                .binding2(200)
                .build();

        component.inject(this);

        theObjectIWant1.doStuff();
        theObjectIWant2.doStuff();
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在想重构这个相同的例子来使用Module.subcomponents属性而不是Subcomponent.Builder工厂方法。为此,我getActivityComponentBuilder()从 中删除AppComponent并将Module.subcomponents属性添加到AppModule

AppComponent(新)

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {

}
Run Code Online (Sandbox Code Playgroud)

应用模块(新)

@Module(subcomponents = ActivityComponent.class)
public abstract class AppModule {
    [...]
}
Run Code Online (Sandbox Code Playgroud)

我的问题很简单。我现在如何ActivityComponent.Builder进入MainActivity? 我不能构造函数注入MainActivity,所以只剩下真正的字段注入:

MainActivity(新的,理论的)

public class MainActivity extends AppCompatActivity {
    @Inject
    ActivityComponent.Builder activityComponentBuilder
    @Inject
    TheObjectIWant theObjectIWant1, theObjectIWant2;

    ((ExampleApp) getApplication()).getAppComponent().inject(this)
    [...]
}
Run Code Online (Sandbox Code Playgroud)

但这行不通,因为AppComponent不能注入theObjectIWant1theObjectIWant1。他们只来自ActivityComponent.

那么这种方法不适合这里吗?由于这更多是一个理论问题,请忽略 dagger.android并假设我们想在没有它的情况下处理这个问题。