Пример. В вашей базе данных есть представление SQL с именем "CustomerOrdersOnHold". Это представление возвращает фильтрованное соединение определенных полей данных клиента и заказа. Вам нужно получить данные из этого представления в приложении. Как доступ к такому представлению подходит к шаблону репозитория? Вы создали бы "CustomerOrdersOnHoldRepository"? Является ли просмотр, доступный только для чтения, таким как это считается совокупным корнем?
Как представления базы данных только для чтения подходят к шаблону репозитория?
Ответ 1
Я бы предпочел отделить читаемый репозиторий, желательно даже изменить его имя на Finder или Reader, репозиторий предназначен для использования в домене, а не для запроса данных только для чтения, вы можете обратиться к эта статья и this, которая объясняет использование репозитория разделенных форм Finder.
Я бы рекомендовал также отделить читаемую модель от архитектуры модели записи CQRS и там
Эта архитектура позволяет отделить модель чтения от модели записи даже с точки зрения хранения данных и использования источников событий.
Для среднего решения вы можете использовать некоторые концепции CQRS без сложности разделения базы данных, просто разделив репозиторий с поисковиками, прочитайте это post
для примера этого типа решения (используйте одну и ту же базу данных, но разделяя поисковые системы с помощью репозиториев). этот пример
Ответ 2
Я думаю, что у вас есть отдельный репозиторий, например "CustomerOrdersOnHoldRepository". Интерфейс репозитория будет отражать тот факт, что объекты являются readonly (не определяя метод Save/Add/MakePersistent).
... Но есть еще одна стратегия, которая мне очень нравится: несколько Хранилища. В нашем примере заказа нет причин, по которым мы можем два репозитория: AllOrders и SurchargedOrders. AllOrders представляют список, содержащий каждый отдельный порядок в системе, SurchargedOrders представляет собой его подмножество.
Я бы не вызвал возвращенный объект как Aggrgate Root. Агрегаты предназначены для согласованности, обмена данными и жизненных циклов. У ваших объектов нет ни одного из них. Похоже, что они также не могут быть классифицированы как объекты ценности ( "характеристика или атрибут" ). Это просто самостоятельные классы.
Ответ 3
Ваши данные только для чтения будут считаться объектами Value в мире DDD.
Я обычно размещаю методы доступа для объектов значений в существующих репозиториях до тех пор, пока не будет смысла создавать отдельный репозиторий. Он похож на метод, который может возвращать статический список состояний, которые будут использоваться в адресной форме:
IAddressRepository
{
Address GetAddress(string addressID);
List<string> GetStates(string country);
}