Dagger 2 Повторное внедрение и сохранение одноэлементной реализации - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть установка 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, чтобы он давал мне единичный экземпляр реализации?

...