android - (Dagger 2) 为 MVP 中的不同类型提供相同的实例
问题描述
我在我的应用程序中遵循 MVP 模式。我有一个视图,它扩展了另一个抽象视图类,实现了另一个接口(比如 A),并且还在 MVP 中实现了视图契约(比如 B)。当我询问类型 A 和 B 时,我想在依赖图中有一个相同的实例。我该如何实现?
简而言之:
class MyAbstractView implements MyInterface {
}
class MyView extends MyAbstractView implements MyViewContract {
}
@Module
class MyModule {
@Provides
MyInterface provideMyInterface() {
return new MyView();
}
@Provides
MyViewContract provideMyViewContract() {
// I cannot call provideMyInterface() and return here
// but I want to return the same MyView instance
// ????
}
}
注意:我不想拥有 MyView 并将其保留在 @Module 中!
解决方案
您可以使用构造函数注入以及@Binds
模块中的注释来实现此目的。只需添加一个构造函数并用@Inject
in注释它MyView
。然后,您可以标记MyView
为@Singleton
以便在任何地方都使用相同的实例(假设该组件的范围也为@Singleton
)。
@Singleton
class MyView extends MyAbstractView implements MyViewContract {
@Inject
public MyView() {}
}
@Module
abstract class MyModule {
@Binds
abstract MyInterface provideMyInterface(MyView myView);
@Binds
abstract MyViewContract provideMyViewContract(MyView myView);
}
推荐阅读
- jquery - Adding links to Google Maps Markers outside of the map using options in a select dropdown
- db2 - Getting NULL Value in Stored Procedure TEXT Column
- typescript - 对象作为 Typescript 中的映射键
- trace32 - Get address of the breakpoint in Lauterbach
- javascript - 上传后如何用javascript显示文件名
- python - How to connect to remote OpenVas scanner with python?
- pyopenssl - Unable to load PEM-encoded private key from Pyjks into PKey object
- django - Using ArrayField and adding 'django_postgres_extensions' to INSTALLED_APPS causes LookupError: No installed app with label 'admin'
- shell - Can't execute sh script with parameters in Ansible
- ada - 使用 LCM 功能时的 CONSTRAINT_ERROR