考虑以下情形:

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/

10-10 03:05