В вашем сценарии, если я не понял неправильно, Building
- это агрегат root, который содержит коллекцию Room
сущностей (запомните этот агрегат сама тоже является сущностью).
хранилище , которое выглядит примерно так, как должно, должно отвечать за операции персистентности (например, создание, поиск, обновление и т. д. c.) вашего агрегата. root, то есть Building
.
public interface Repositoy<Building> {
Building findById(String buildingId);
void store(Building building);
}
Вы правильно указали, что операции с доменом (например, добавление места в вашем случае) должны выполняться через совокупность root. Однако совокупный root (или любой другой объект) не должен принимать на себя обязанности по сохранению (как вы сказали: db.create(room)
).
Клиент взаимодействует с доменом через служба домена или служба приложений . Они, в свою очередь, извлекают агрегат root через свой репозиторий, вносят необходимые изменения и сохраняют весь агрегат в одной транзакции. Следовательно, при каждой успешной транзакции у вас всегда есть непротиворечивый агрегат с его дочерними элементами в базе данных, и вам не о чем беспокоиться из-за отсутствия родителя, дочернего элемента и т. Д. c.
public class SomeDomainOrApplicationService {
private Repositoy<Building> repository;
public void createRoomServiceMethod(String buildingId) {
// retrieve aggregate root
Building building = repository.findById(buildingId);
// modify aggregate
String roomName; // assign room name
building.addRoom(roomName);
// store aggregate
repository.store(building);
}
}
.