(Dagger 2) MVP中不同类型提供相同实例
(Dagger 2) Provide same instance for different types in MVP
我在我的应用程序中遵循 MVP 模式。我有一个扩展另一个抽象视图 class 的视图,它实现了另一个接口(比如 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
注释来实现此目的。只需添加一个构造函数并在 MyView
中用 @Inject
注释它。然后,您可以将 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);
}
我在我的应用程序中遵循 MVP 模式。我有一个扩展另一个抽象视图 class 的视图,它实现了另一个接口(比如 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
注释来实现此目的。只需添加一个构造函数并在 MyView
中用 @Inject
注释它。然后,您可以将 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);
}