Подтвердить что ты не робот

Как представления базы данных только для чтения подходят к шаблону репозитория?

Пример. В вашей базе данных есть представление SQL с именем "CustomerOrdersOnHold". Это представление возвращает фильтрованное соединение определенных полей данных клиента и заказа. Вам нужно получить данные из этого представления в приложении. Как доступ к такому представлению подходит к шаблону репозитория? Вы создали бы "CustomerOrdersOnHoldRepository"? Является ли просмотр, доступный только для чтения, таким как это считается совокупным корнем?

4b9b3361

Ответ 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);
}