Skip to content

Предложение по улучшению кейса аутентификации #22

Open

Description

@ultimate-deej

Сразу к сути: идея в том, чтобы отвязать интерактор от роутера.
Ведь как известно интерактор не должен зависеть от внешних слоёв и внешних библиотек. То, что он знает о cicerone или о PIN_SCREEN - плохо.

Вместо этого, если уж возникла такая потребность, с ним следует работать как и с репозиториями (и с внешним миром вообще) через интерфейс, объявленный в слое домена. По сути интерфейс даже не должен представлять роутер, т.к. домен знать не знает, как в приложении реализована навигация. И такой уже есть в примере, это PinCodeListener.

Навскидку, в первом приближении это может выглядеть так. Вместо явного вызова роутера из интерактора:

private void subscribeToAuthHolder() {
    authHolder.subscribeToSessionExpired(() -> {
        if (pinCodeListener != null) pinCodeListener.needUpdatePinCode();
    });
}

реализуем PinCodeListener где-то в слое навигации (где, кстати?):

public class PinCodeUpdater implements PinCodeListener {
    ...

    public void needUpdatePinCode() {
       router.navigateTo(GlobalNavigator.PIN_SCREEN); 
    }

    ...
}

и прокидываем в домен как зависимость вместо роутера:

public class PinInteractorImpl implements PinInteractor {
    private PinCodeListener pinCodeListener;
    ...

    public PinInteractorImpl(AuthRepository authRepository, PinCodeListener pinCodeListener) {
        this.pinCodeListener = pinCodeListener;
        ...
    }

    private void subscribeToAuthRepos() {
        authRepository.subscribePinCodeNeedUpdate(pinCodeListener);
    }

    ...
}

Всё. Изменения минимальны, но домен избавился от зависимости. Можно и на модули резать :).

Если моё предложение вам понравилось, могу заняться pull request'ом.

Activity

  1. matzuk commented on Nov 3, 2018

    @matzuk
    Member

    Звучит хорошо. Давай оформим PR.
    По поводу имплементации PinCodeListener. Можно где-то в presentation/navigation.
    Я кстати обновлю инфо по пакетам за одно.

  2. ultimate-deej commented on Nov 12, 2018

    @ultimate-deej
    Author

    Проект крашится, ветка sample_2. Ругается на call adapter factory и response body converter. В build.gradle кроме самого ретрофита ничего нет, хотя точно нужен адаптер для rxjava2.
    Я туда хоть смотрю? https://github.com/AndroidArchitecture/AuthCase/tree/sample_2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions