DDD рекомендует выделить хранилище для извлечения и хранения одного агрегата root; Совокупные корни - это сущности , играющие важную роль в домене. Модификации сущностей должны происходить через агрегат root: извлечь агрегат root с его хранилищем, внести необходимые изменения и сохранить его обратно. Агрегированные root составляющие сущности не должны извлекаться и изменяться независимо , поэтому для них нет репозиториев.
В вашем случае, в зависимости от контекста, Foo1
представляется совокупным root. Только один репозиторий для Foo1
должно быть достаточно; хранилище для Foo2
является избыточным. Вы можете и должны изменить свойство Foo1
Foo2
- Foo1
после получения экземпляра Foo1
; Foo2
нельзя извлекать и изменять независимо, поэтому нет необходимости в Foo2
хранилище.
Однако, опять же, в зависимости от контекста, если вы обнаружите, что Foo2
является совокупностью root вместе с Foo1
, только тогда он заслуживает своего собственного хранилища. В этом случае, однако, Foo1
не должен содержать ссылку на Foo2
(то есть прямую ссылку на другой агрегат root, что не рекомендуется) и изменять его в транзакции; вместо этого он должен ссылаться на Foo2
только по своему идентификатору , как показано ниже для вашего примера:
public class Foo1
{
public int Id { get; set; }
// .... More data
public int foo2Id { get; set; } // Foo2 identfier only, not a Foo2 instance
}
public class Foo2
{
public int Id { get; set; }
public int Type { get; set; }
}
Если для модификации Foo1
требуется то же самое для Foo2
, это должно быть выполняется путем извлечения Foo2
по его идентификатору, который хранится в Foo1
, как показано в следующем примере. Обратите внимание, что для простоты пример изменяет оба агрегатных корня в одной транзакции; однако такого рода модификации обычно происходят в отдельных транзакциях и в конечном итоге согласованы .
Foo1 foo1 = foo1Repository.findById(foo1Id);
// modify foo1 state
Foo2 foo2 = foo2Repository.findById(foo1.foo1Id);
// modify foo2 state
// persist changes
foo1Repository.store(foo1);
foo2Repository.store(foo2);