我有一个Dagger设置,在其中我根据用户采取的操作在运行时动态注入。例如,如果用户选择一个按钮,那么我将使用AWS实施,而如果选择了另一个按钮,则我将使用Facebook实施。然后,我想将其保留为单例,并在整个应用程序中使用,而不是每次都创建新的组件和实现实例。
应用程序类
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
}
public AuthenticationComponent createAuthenticationComponent(Context context, ApiAuthType apiAuthType) {
return DaggerAuthenticationComponent
.builder()
.authenticationModule(new AuthenticationModule(context))
.apiTypeModule(new ApiTypeModule(apiAuthType))
.build();
}
}
模块
@Module
public class AuthenticationModule {
private Context context;
public AuthenticationModule(Context context) {
this.context = context;
}
@Provides
@Inject
@Singleton
AuthenticationService provideAuthenticationService(ApiAuthType apiAuthType) {
switch (apiAuthType) {
case FACEBOOK:
return new FacebookAuthenticator();
case GOOGLE:
return new GoogleAuthenticator();
case AWS:
return new AwsCognitoAuthenticator(context);
default:
return new AwsCognitoAuthenticator(context);
}
}
}
组件
@Singleton
@Component(modules = { ApiTypeModule.class, AuthenticationModule.class })
public interface AuthenticationComponent {
void inject(LoginActivity activity);
void inject(MainActivity activity);
void inject(SignUpActivity activity);
void inject(ForgotPasswordActivity activity);
}
@Module
public class ApiTypeModule {
private ApiAuthType apiAuthType;
public ApiTypeModule(ApiAuthType apiAuthType) {
this.apiAuthType = apiAuthType;
}
@Provides
ApiAuthType provideApiType() {
return apiAuthType;
}
}
注入Activity内部
((MyApp) getApplication())
.createAuthenticationComponent(this, ApiAuthType.FACEBOOK)
.inject(this);
是否有一种方法可以限制使用同一组件(而不是每次都重新创建),而是更改ApiAuthType以便它为我提供实现的单例实例?