Репозиторий как только связь с Data Layer?

Я следую чистой архитектуре, и я понимаю использование хранилища для таких действий, как getUsers или queryUsers. Однако для меня не имеет смысла использовать хранилище для входа в систему пользователя. Как мне тогда взаимодействовать с уровнем данных, должен ли я пропустить уровень репозитория и получить доступ к сетевому уровню?

3 ответа

Решение

Я определенно думаю, что вы не должны пропускать слои.

Весь смысл внедрения определенной архитектуры состоит в том, чтобы следовать ей без исключения, поэтому все модули вашего приложения ведут себя ожидаемым и предсказуемым образом.

Итак, если вы посмотрите на это с другой стороны, что означает вход в систему? Вы получаете имя пользователя и пароль, и вы должны проверить, соответствуют ли они имени пользователя и паролю, которые хранятся в вашем источнике данных. Для этого вы запускаете запрос к вашим текущим пользователям. И запросы выполняются где - в хранилище! Вы сказали это сами - в хранилище должны быть все запросы. То, что за этим стоит, не имеет значения.

Итак, я предлагаю добавить такой метод:

public interface UserRepository {

    User findByUsernameAndPassword(@NonNull String username, @NonNull String 
password);

}

Если вам удастся найти пользователя - хорошо, он аутентифицирован, если нет - извините, попробуйте еще раз.

Я верю в чистую архитектуру, вы не должны пропускать слои. Я вижу несколько вариантов здесь:

  • userRepository.get\set-User() - для меня это выглядит немного странно, потому что Repository - это абстракция над коллекцией, в то время как нам нужен только один.
  • создать абстракцию над пользовательским хранилищем. Например, userStorage.get\set-User() or userStorage.login(User), logout(), get()

Исходя из этого руководства, я думаю, что лучше использовать репозиторий. мой ответ основан на определении цитаты хранилища:

Модули репозитория отвечают за обработку данных.

Другие вопросы по тегам