Я бы сказал, что для каждого объекта есть свой DAO. Почему? Потому что вы правильно их разделяете.
Допустим, у вас есть DAO, который содержит сущности A и B. В вашем хранилище вам может понадобиться только сущность A, тогда не будет никакого смысла в том, что этот DAO также использует сущность B.Если возникает случай, когда вам нужны оба объекта, просто используйте оба DAO.Еще одна причина для отдельных DAO заключается в том, что вы не знаете, как правильно связать сущности.Как вы решите, какие сущности объединить в DAO?Да, вы можете решить это в зависимости от репозитория, который его использует, но это может привести к дублированию кода (два DAO используют один и тот же объект, но каждый из них также использует второй объект, который отличается для каждого DAO).
Относительно вашего второго вопроса: я полагаю, что именно от вашей архитектуры зависит, как именно должен быть смоделирован ваш репозиторий.
Например, при использовании MVVM:
Требование: У вас есть действие, просто отображающее список изображений, извлеченных откуда-то.
Тогда ваша ViewModel будетпредложите функцию типа getAllImageModels
или что-то подобное.Каждая из этих ImageModels будет включать изображение (которое будет отображаться).Внутри этой функции репозиторий называется либо вызовом API для получения списка изображений для загрузки, либо вызовом базы данных для получения списка из базы данных (в зависимости от интернет-соединения).Эти изображения также должны быть загружены.Снова изображения могут быть загружены из локального кэша или загружены через API.Затем ViewModel оборачивает их в желаемую модель, необходимую для View, и это все.
Как видно из этого простого примера, репозиторий сам по себе просто выполняет запросы.Либо для локальной файловой системы, базы данных или API.В нем могут быть такие функции, как getImageListFromDb
и getImageListFromAPI
.Так что классы, которые его используют, просто должны решить, когда что использовать.