DDD и ссылки между агрегатами в EFCore и C # - PullRequest
0 голосов
/ 03 марта 2019

У меня есть проблема, которую я не знаю, как решить, когда предполагается использование DDD и использование C # / EF Core.Упрощенная ситуация: у нас есть 2 агрегата - Товар и Склад .Каждый из них имеет свою идентификацию с помощью ExternalId (Guid), чтобы идентифицировать его снаружи (FE и т. Д.), Что также рассматривается как идентификация его домена.У него также есть база данных Идентификатор, который идеализирует его внутри модели баз данных - модель Entity и модель Db того же класса, что и EF Core, позволяют использовать закрытые поля - только ExternalId и обязательные поля открыты.Сущность (в смысле DDD и EF Core) содержит довольно много бизнес-логики и методов, строго связанных с объектом.В общем, я следую шаблону из примера eShop / eShopOnContainers.

Элемент назначен на склад, и при создании элемента нам нужно передать склад на его конструктор.

Правильно ли передать полный складОбъект для конструктора Item (но также и для других методов, которые определяет Item):

public Item(Warehouse warehouse,..)

или я должен передавать только по идентификатору базы данных:

public Item(long warehouseId,..)

У меня есть проблема по этому поводу, потому чтоС одной стороны, я прочитал, что агрегаты не должны ссылаться на другие агрегаты, но, с другой стороны, при использовании Datbase DB утечка деталей реализации (персистентность объекта в реляционной БД) в модель предметной области, которая, по моему мнению, не должна происходить.

Использование ExternalId:

public Item(Guid warehouseId,..)

не решает проблему, поскольку фактические отношения в db не основаны на ней.

Каково ваше мнение?Я немного озадачен.

1 Ответ

0 голосов
/ 03 марта 2019

Обычно вы создаете объект значения для идентификатора совокупного корня.Это одна возможность полагаться на идентификатор, сгенерированный базой данных.Если вы решите позволить Db генерировать Id, вам нужно будет поработать с этим.Но зачем вам в любом случае передавать ссылку или идентификатор хранилища?Похоже, что Предмет - это Сущность, а Склад - Совокупный Корень, который должен содержать эту Сущность.В общем, вы не должны создавать сущность вне совокупного корня.

Редактировать: Существует несколько стратегий создания идентичности , как описывает Вон Вернон в Красной книге.Одним из них является то, что механизм персистентности, такой как SQL Db, генерирует уникальный идентификатор объекта или агрегата.

...