Вопрос:

Зависимости между объектом домена, фабрикой и хранилищем

repository domain-driven-design factory

1047 просмотра

1 ответ

535 Репутация автора

Хорошо, я прочитал много вещей о шаблоне хранилища, включая книгу Фаулера. Я довольно хорошо знаю, что это такое и что он делает, однако я пока не совсем уверен, как его называют фабрики и / или доменные объекты.

Что я понял, так это то, что хранилище должно действовать как коллекция объектов домена в памяти, а фабрика - это класс, отвечающий за создание экземпляра: new myDomainObject()

Имея это в виду, кажется очевидным, что хранилищу понадобится ссылка на фабрику для создания новых объектов из запросов источника данных. (Репозиторий -> Фабрика)

Доменные объекты также нуждаются в ссылке на фабрику для создания новых объектов.

Моя дилемма - когда объект домена хочет получить существующий объект, должен ли он вызывать хранилище или фабрику? Если он вызывает хранилище напрямую (Domain -> Repository -> Factory), то для этого потребуются ссылки на фабрику и хранилище, что мне кажется слишком большим, но так ли это плохо?

С другой стороны, если он вызывает фабрику как factory.CreateObjectWithId(id), то фабрика должна будет только перенаправить вызов в хранилище repository.GetById(id), и этот последний вызовет другой метод на той же фабрике для создания объекта (если он еще не находится в памяти) factory.CreateObject(dataset), так что это приводит к циклической ссылке: Доменный объект -> Фабрика <-> Репозиторий, что опять же не кажется мне действительно хорошей вещью.

Так по вашему мнению какой из этих вариантов лучше? или есть другой вариант?

Автор: Jonathan Источник Размещён: 16.12.2015 01:22

Ответы (1)


5 плюса

12685 Репутация автора

Решение

Вы правильно поняли основы. Похоже, ваше неправильное понимание исходит из вашего предположения, что доменные объекты должны быть основными клиентами репозиториев. Это не тот случай, вам следует обращаться к репозиториям только из доменных объектов, если другого пути нет. Старайтесь избегать этого в целом.

Таким образом, недостающая часть в вашем уравнении - это то, что действует как основной клиент хранилищ.

Enter: Сервис приложений

Служба приложения - это служба, которая содержит логику прецедента (в отличие от логики домена). Он выполняет проверку ввода, реализует управление доступом и отвечает за управление транзакциями.

Это означает, что служба приложения будет использовать репозиторий для загрузки агрегата из БД, что-то с ним делать, а затем убедиться, что изменения сохраняются (т.е. фиксируют транзакцию).

В зависимости от стиля репозитория, который вы используете, сохранение агрегата обратно в БД может немного отличаться:

  • В репозиториях в стиле коллекции служба приложения обычно использует единицу работы, чтобы отслеживать и фиксировать изменения.
  • В репозиториях в стиле команд служба приложения передает агрегат обратно в репозиторий после выполнения бизнес-операции над ним.

Заводы и хранилища

Что касается ваших вопросов о взаимоотношениях между фабриками и хранилищами, я думаю, что этот мой ответ также дает ответ на ваш вопрос. Основная суть этого:

  • Используйте фабрику из хранилища, чтобы избежать дублирования логики создания агрегата.
  • Убедитесь, что концепции понятны извне, т.е. не открывайте «интерфейс восстановления» фабрики, который репозиторий видит для других классов. Этого лучше всего достичь, следуя принципу разделения интерфейса .

Использование репозиториев из домена

Если вам постоянно приходится запрашивать другие агрегаты из БД для выполнения бизнес-задач на уровне домена, это указывает на то, что границы ваших агрегатов могут быть неправильными.

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

Автор: theDmi Размещён: 16.12.2015 04:33
Вопросы из категории :
32x32