У меня есть установка 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;
}
}
Инъекция внутрь Действия
((MyApp) getApplication())
.createAuthenticationComponent(this, ApiAuthType.FACEBOOK)
.inject(this);
Есть ли способ ограничения использования одного и того же компонента (вместо повторного создания каждый раз), но измененияApiAuthType, чтобы он давал мне единичный экземпляр реализации?