Куда относятся все «массовые» операции в DDD? - PullRequest
9 голосов
/ 18 февраля 2009

В DDD одним из ключевых понятий является репозиторий, который позволяет извлекать сущности (или совокупные корни), а затем сохранять их после обновления.

Давайте предположим, что нам нужно выполнить некоторую «массовую» операцию с сущностями, а количество сущностей делает абсолютно невозможным их извлечение в память. То есть Операция может быть выполнена только в базе данных.

Где место для такой «массовой» операции? Должен ли это быть метод в хранилище? Не «утечет» ли абстракция репозитория при выполнении конкретной операции с базой данных? Разве это не переместит бизнес-операцию из сущности в репозиторий?

Ответы [ 4 ]

6 голосов
/ 26 августа 2009

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

Эванс рекомендует в своей книге, если вы сомневаетесь, следует ли помещать метод, который "плохо пахнет" внутри класса, потому что вы думаете, что он там не принадлежит, создайте класс ServiceFoo с этой операцией внутри.

4 голосов
/ 18 февраля 2009
void DoLongInvolvedTask();

Я не вижу ничего плохого в том, чтобы помещать массовые задачи в качестве методов в ваше хранилище. Они ничего не пропускают. Операция Bulk не подразумевает каких-либо определенных операций с базой данных, то есть, если ваш метод не похож на ReBuildMSSQLIndexesOnMyBigTable ().

3 голосов
/ 26 августа 2009

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

РЕДАКТИРОВАТЬ: Исходная ссылка исчезла. Вы можете найти глоссарий терминов DDD здесь, но он не так полезен, как оригинальная страница. http://dddcommunity.org/resources/ddd_terms/

1 голос
/ 18 февраля 2009

У вас не должно быть логики сохранения, получения в доменном объекте (я предполагаю, что вы используете модель домена) Это ответственность Репозитория. Таким образом, ваш основной метод принадлежит хранилищу.

Если вы используете ORM, то ваши репозитории не будут зависеть от базы данных. они будут перенаправлять весь запрос на уровень ORM.

Если вы пишете свой собственный mapper, то репозиторий перенаправит запрос к mapper для сущности. И я думаю, что это соединение в порядке.

...