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不能注入theObjectIWant1和theObjectIWant1。他们只来自ActivityComponent.
那么这种方法不适合这里吗?由于这更多是一个理论问题,请忽略 dagger.android并假设我们想在没有它的情况下处理这个问题。
| 归档时间: |
|
| 查看次数: |
296 次 |
| 最近记录: |