Зависимости между объектом домена, фабрикой и хранилищем
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Вопросы из категории :
- repository Как мне клонировать только подкаталог Git-репозитория?
- repository Как вы клонируете репозиторий Git в определенную папку?
- repository Как я могу индексировать наш внутренний исходный код?
- repository Удалить файл из репозитория Git, не удаляя его из локальной файловой системы
- repository Как переместить файлы из одного git-репо в другой (не клон), сохраняя историю
- repository Как объединить два репозитория Git?
- domain-driven-design Какие методы должны идти в моем классе фабрики DDD?
- domain-driven-design DDD, NHibernate и структура проекта / наименование
- domain-driven-design лучшие практики с кодом или таблицами поиска
- domain-driven-design Я нарушаю свои совокупные границы?
- domain-driven-design Как сохранить ваши модульные тесты простыми и изолированными и при этом гарантировать DDD-инварианты?
- domain-driven-design Ловушки доменного дизайна (DDD)
- factory Заводская модель. Когда использовать фабричные методы?
- factory Можно ли использовать инициализатор объекта ac # с фабричным методом?
- factory Может ли конструктор Java создать объект подкласса?
- factory Как я могу провести модульное тестирование на заводе?
- factory Передать аргументы Конструктору в VBA