-
Notifications
You must be signed in to change notification settings - Fork 60
Description
Сразу к сути: идея в том, чтобы отвязать интерактор от роутера.
Ведь как известно интерактор не должен зависеть от внешних слоёв и внешних библиотек. То, что он знает о 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'ом.