Как правильно ссылаться на коллекцию агрегатов? - PullRequest
0 голосов
/ 14 марта 2019

В DDD существует различие между сущностью и совокупностью. В EFCore я доволен подходом использования частных коллекций и использования шаблона спецификации для заполнения дочерних объектов, когда это необходимо. Точно так же Джули Лерман и другие написали действительно хорошие статьи по адаптации EF для DDD.

Агрегат, в отличие от сущности, может / должен содержать только ссылку на идентификатор другого агрегата, а не свойство навигации, которое мы можем использовать для возврата через репозиторий с помощью вызова GetById().

Что является еще одной проблемой, это определить, как Aggregate может содержать коллекцию ссылок Id на коллекцию Aggregates и как этого можно достичь с помощью Entity Framework?

Как правило, вы устанавливаете его с помощью свойств навигации и внешних клавиш.

public Class Foo
(
  public List<Bar> Bars { get; set; }
)

Однако я хочу соответствовать DDD.

public Class Foo
(
  public List<int> BarIds { get; set; }
)

То, что я не хочу иметь, - это совокупность Bar, зная, что она имеет отношение к Foo, на которую могут ссылаться многие другие агрегаты.

Возможно, это тот случай, когда у вас не может быть совокупности идентификаторов агрегатов в агрегате?

1 Ответ

1 голос
/ 15 марта 2019

Как правильно ссылаться на коллекцию агрегатов?

Вы ссылаетесь на агрегат по его идентификатору. Таким образом, вы ссылаетесь на набор агрегатов с помощью набора идентификаторов (каждый идентификатор ссылается на агрегат).

как Агрегат может содержать Id ссылку на другой Агрегат

Все просто: идентификатор другого агрегата - это поле в агрегате, содержащее ссылку.

как этого можно достичь с помощью Entity Framework?

Я не знаю EF, но агрегат содержит ссылку на идентификатор так же, как и любое другое поле агрегата.

Я не знаю причину борьбы.

Скажем, у вас есть 2 агрегата: Foo и Bar, так что Foo ссылается на Bar (Foo ==> Bar). Если клиент Foo хочет получить экземпляр Bar, на который ссылается экземпляр Foo:

String aFooId = ...
Foo aFoo = fooRepository.getById ( aFooId );
String aBarId = aFoo.barId();
Bar aBar = barRepository.getById ( aBarId );
...