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

repository domain-driven-design factory

1047 просмотра

1 ответ

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

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

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

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

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

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

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

Автор: Jonathan Источник Размещён: 13.11.2019 11:48

Ответы (1)


5 плюса

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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