Мы используем несколько отдельных классов с суффиксами -repository
для извлечения данных из базы данных; для каждой таблицы свой репозиторий.
Например, у нас есть customerrepository
класс, который имеет все виды методов для поиска клиентов, и класс, который имеет все виды vacancyrepository
методов для поиска вакансий.
У меня есть два вопроса об этом способе ведения дел:
Как насчет получения данных, которые охватывают несколько таблиц? Например, у меня есть экран, который показывает всех клиентов, которые еще не создали вакансию. Могут ли
customerrepository
методы использования изvacancyrespository
или оба хранилища возвращать результаты, и есть ли класс в иерархии выше (назовем его adataservice
), который получает результаты из обоих хранилищ и объединяет их в 1 результат?сколько логики может обработать такой репозиторий?
Я думаю, что это нормально для реализации 'where active == true' в хранилище для извлечения только активных записей, или даже эта простая логика должна обрабатываться классом выше в иерархии (назовем это adataservice
)?
Вот пример, с которым я столкнулся:
У нас есть список вопросов, который содержит один или несколько вопросов.
Вопрос может иметь результат, который хранится в отдельной таблице.
Поэтому, когда вы хотите получить общий результат из списка вопросов, вы должны объединить данные из questionlist
таблицы, таблицы вопросов и questionstatus
таблицы.
Сейчас у нас есть 3 разных репозитория для этих таблиц.
Если бы я спросил, questionlistrepository
каков общий результат для списка № 12, он должен был бы получить данные из двух других репозиториев и, следовательно, иметь некоторую логику, разрешено ли это?
Или есть тот, questionlistdataservice
который знает, какие репозитории использовать?
Еще одна вещь: наши репозитории могут привести к IQueryable
тому, что вызывающая служба может легко объединить результаты, но как насчет того, когда это не так, я не думаю, что это хорошая идея, чтобы извлечь все содержимое всех трех таблиц из база данных.
источник
Ответы:
Репозиторий возвращает доменные объекты и построен поверх слоев отображения. Для очень простых доменов доменные объекты и таблицы базы данных могут быть практически одинаковыми.
Если ваш репозиторий всегда возвращает точное представление вашей структуры данных, то на самом деле это может быть шлюз табличных данных, он же объект доступа к данным (DAO).
Пример: в вашей базе данных есть таблицы для персоны и адреса. В вашем приложении адрес домена не является собственной сущностью, это просто свойство Person. В этом случае у вас не будет PersonRepository и AddressRepository. У вас просто есть PersonRepository. Домен не должен беспокоиться о том, как данные домена сохраняются. Эти обязанности находятся в слое за хранилищем.
Из вашего примера может показаться, что вы на самом деле имеете DAO и только что назвали их Repositories.
источник