考虑以下情形:
public class SessionManager implements HasSession, HasCredentials{
/**implementation here*/
}
我定义了一个SessionModule,以便在每次请求HasSession或HasCredentials进行注入时注入SessionManager:
@Module
public abstract class SessionModule {
@Provides @Singleton static HasSession hasSession(SessionManager sessionManager){
return sessionManager;
};
@Provides @Singleton static HasCredentials hasCredentials(SessionManager sessionManager){
return sessionManager;
};
}
然后,我定义了相应的组件:
@Component(modules={SessionModule.class})
@Singleton
public interface MyComponent {
public HasSession getSessionProvider();
public HasCredentials getCredentialsProvider();
}
getSessionProvider和getCredentialsProvider将创建/返回两个不同的SessionManager实例。
每当我调用getSessionProvider或getCredentialsProvider时,我都希望创建并返回一个SessionManager实例。我如何用Dagger 2完成它?
最佳答案
您需要做两件事:
限制绑定的范围,以便只有一个实例。
别名范围绑定到备用类型。
首先,确定绑定范围:
@Qualifier
private @interface Scoped {}
@Provides @Singleton
@Scoped SessionManager scopeSessionManager(SessionManager manager) {
return manager;
}
其次,给作用域绑定起别名:
@Binds abstract HasSession bindHasSession(@Scoped SessionManager manager);
@Binds abstract HasCredentials bindHasCredentials(@Scoped SessionManager manager);
注意:这不会阻止该组件中的模块使用不受作用域的
SessionManager
,因此请小心。一种简单的解决方法是使用
@Component.Builder
并使用@BindsInstance
传入有效范围内的SessionManager
的单个实例(从而消除了上面第一个代码段的需要,并允许原始代码运行)。关于java - 如何使两个不同的@Providers在Dagger 2中注入(inject)相同的@Singleton?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47422141/