Dagger 2重新注入并保留单例实现

时间:2018-12-12 10:59:05

标签: java android dagger-2

我有一个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以便它为我提供实现的单例实例?

0 个答案:

没有答案