Android Dagger 2 和 MVP 在注入的对象中注入
Android Dagger 2 and MVP injecting inside an injected object
我想使用具有 MVP 模式的 Dagger 2。所以我有这种情况,每个 View
都有自己的 Component
例如MyFragment
有一个这样的组件:
@PerFragment @Component(dependencies = ActivityComponent.class, modules = MyFragmentModule.class)
public interface MyFragmentComponent {
void inject(MyFragment fragment);
}
并且在 MyFragmentModule
中,我提供了一个演示者和一个将在 MyFragment
中使用的模型
@Module public class MyFragmentModule {
@Provides @PerFragment public MyPresenter providePresenter() {
return new MyPresenter();
}
@Provides @PerFragment public Model provideModel() {
return new Model();
}
}
现在我在 MyFragment
:
中注入组件
public class MyFragment extends Fragment{
@Inject MyPresenter presenter;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
component = DaggerMyFragmentComponent.builder()...build();
component.inject(this);
}
}
另外 MyPresenter
是这样的:
public class MyPresenter {
@Inject Model model;
}
问题
我不知道如何在我的演示者中注入 Model
。我不想像我在 MyFragment
.
中那样在演示者中注入组件
这种做法有什么办法吗?
考虑到必须通过组件手动调用字段注入,您需要引用您的组件。当然,你不应该合法地在你的 Presenter 中创建一个新组件,我认为你应该做的是提供 class 来保存对组件的引用。
请检查编辑以获得正确的解决方案。
@Module
public class MyFragmentModule {
private MyFragment myFragment;
public MyFragmentModule(MyFragment myFragment) {
this.myFragment = myFragment;
}
@Provides
public MyFragment myFragment() {
return myFragment;
}
@Provides @PerFragment public MyPresenter providePresenter(MyFragment myFragment) {
return new MyPresenter(myFragment);
}
@Provides @PerFragment public Model provideModel(MyFragment myFragment) {
return new Model(myFragment);
}
}
public class MyPresenter {
@Inject Model model;
public MyPresenter(MyFragment myFragment) {
myFragment.getComponent().inject(this);
}
}
你的另一个选择是构造函数注入。
public class MyPresenter {
private Model model;
public MyPresenter(Model model) {
this.model = model;
}
}
@Provides @PerFragment public MyPresenter providePresenter(Model model) {
return new MyPresenter(model);
}
编辑:第三种解决方案是完全跳过 Presenter 模块,只使用 @Inject
带注释的构造函数。
@PerFragment
public class MyPresenter {
private Model model;
@Inject
public MyPresenter(Model model) {
this.model = model;
}
}
或
@PerFragment
public class MyPresenter {
@Inject
Model model;
@Inject
public MyPresenter() {
}
}
我想使用具有 MVP 模式的 Dagger 2。所以我有这种情况,每个 View
都有自己的 Component
例如MyFragment
有一个这样的组件:
@PerFragment @Component(dependencies = ActivityComponent.class, modules = MyFragmentModule.class)
public interface MyFragmentComponent {
void inject(MyFragment fragment);
}
并且在 MyFragmentModule
中,我提供了一个演示者和一个将在 MyFragment
@Module public class MyFragmentModule {
@Provides @PerFragment public MyPresenter providePresenter() {
return new MyPresenter();
}
@Provides @PerFragment public Model provideModel() {
return new Model();
}
}
现在我在 MyFragment
:
public class MyFragment extends Fragment{
@Inject MyPresenter presenter;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
component = DaggerMyFragmentComponent.builder()...build();
component.inject(this);
}
}
另外 MyPresenter
是这样的:
public class MyPresenter {
@Inject Model model;
}
问题
我不知道如何在我的演示者中注入 Model
。我不想像我在 MyFragment
.
这种做法有什么办法吗?
考虑到必须通过组件手动调用字段注入,您需要引用您的组件。当然,你不应该合法地在你的 Presenter 中创建一个新组件,我认为你应该做的是提供 class 来保存对组件的引用。
请检查编辑以获得正确的解决方案。
@Module
public class MyFragmentModule {
private MyFragment myFragment;
public MyFragmentModule(MyFragment myFragment) {
this.myFragment = myFragment;
}
@Provides
public MyFragment myFragment() {
return myFragment;
}
@Provides @PerFragment public MyPresenter providePresenter(MyFragment myFragment) {
return new MyPresenter(myFragment);
}
@Provides @PerFragment public Model provideModel(MyFragment myFragment) {
return new Model(myFragment);
}
}
public class MyPresenter {
@Inject Model model;
public MyPresenter(MyFragment myFragment) {
myFragment.getComponent().inject(this);
}
}
你的另一个选择是构造函数注入。
public class MyPresenter {
private Model model;
public MyPresenter(Model model) {
this.model = model;
}
}
@Provides @PerFragment public MyPresenter providePresenter(Model model) {
return new MyPresenter(model);
}
编辑:第三种解决方案是完全跳过 Presenter 模块,只使用 @Inject
带注释的构造函数。
@PerFragment
public class MyPresenter {
private Model model;
@Inject
public MyPresenter(Model model) {
this.model = model;
}
}
或
@PerFragment
public class MyPresenter {
@Inject
Model model;
@Inject
public MyPresenter() {
}
}