Интерактор в интеракторе или другой интерактор
Есть несколько интеракторов:
ObjectsInteractor(внутри objectsRepository, treeRepository, stateRepository)UserInteractor(внутри userRepository)AuthInteractor(внутри userRepository, authRepository)SecurityInteractor(внутри securityRepository)SettingsInteractor(внутри settingsRepository)
Необходимо очистить пользовательские данные (logout).
Первоначально сделал так:
В SettingsViewModel есть все перечисленные выше интеракторы, и у них во всех есть функция clear() - эти функции не просто перебрасывают clear в соответствующий репозиторий, а в некоторых есть какая то особая логика. При нажатии на кнопку logout, я друг за другом тяну функции clear у выше описанных интеракторов и при успешном выполнении цепочки выхожу на экран авторизации. Было все прекрасно :)
Но сейчас необходимо сделать функцию logout еще и в SecurityView (экран входа по паролю).
Прикинул два способа решения:
В принципе могу сделать также как выше в
SettingsViewModel. Но тогда я должен буду скопировать код и каждый раз менять этот код в двух местах (может потом в трех и т.д.) при каких то изменениях, например, при logout придется еще добавить очистку чего либо или там какой то request делать(в цепочку вызова что-то добавляется).Или могу сделать еще один интерактор
AppDataInteractorи внутри него выполнять очистку всех данных, но в этом случае мне нужно будет либо копировать функцииclearиз всех выше перечисленных инеракторов и придется всегда при изменении логики этих методов менять их в соответствующих интеракторах и вAppDataInteractorлибо мне надо вAppDataInteractorдержать ссылки на вышеперечисленные интеракторы и вызывать их функции, а это уже совсем плохо (по феншую, один useCase не должен знать о другом).
Я даю предпочтение первому способу(так уже сделано). Что посоветуете вы?
Ответы (1 шт):
Я не очень уверен, что до конца вас понял но все же накину.
Я конечно не знаю сколько у вас там еще интеракторов, но если выше перечисленные это и есть все, то можно создать какой-то abstract class/interface и в нем иметь метод clear() от которого будут наследоваться/имплементировать интеракторы. При нажатии кнопки logout(). Можно создать какой-то хендлер который будет хранить в себе созданные экземпляры интеракторов (тут можно подумать о том, чтоб в нем были методы add() и remove()) и он имел бы метод clear() который пробегался бы по всем интерракторам и вызывал метод clear() внутри каждого (а там они везде реализованы по своему). Можно в этот метод на вход передавать какие-то фильтры и если вдруг вам необходимо чистить интеракторы по какому-то предикату.
А вообще здесь нужно видеть какие-то кейсы и код. Так очень трудно дать какой-то ответ.