Генерации идентификаторов для лица в ДДД


Edit

Чтобы еще больше прояснить мою первоначальную проблему, я переписал вопрос с большим количеством " DDD " -Термини, общих шаблонов и аргументов для обсуждения. Исходную версию можно найти в разделе revisions.

Где и как тождества для сущностей/aggregate корни генерируются внутри домена при правильном применении DDD?

Мне нужно присвоить уникальные идентичности моим сущностям, либо при создании, либо при сохранении. Те идентичности могут быть представлены в нескольких стилях

  • вычисляется (исходя из характеристик объекта, следовательно, исходя из бизнес-требований)
  • естественный (основанный на определенном наборе правил, следовательно, основанный на бизнес-логике)
  • суррогаты (основанные на случайно сгенерированных значениях без бизнес-смысла)

Существует множество подходов к задаче генерации и присвоения тождеств, начиная с использования фабрик для создания тождеств, делегирования инфраструктура, использующая ORM или генерацию баз данных и т. д. Однако, если правильно применять DDD, где и как должны генерироваться идентичности, учитывая, что мы не хотим анемичных доменных моделей и инъекции сервисов в сущности ?

Требования , заявленные выше

  • отсутствие анемичных доменных моделей
  • нет внедрения зависимостей служб в сущности

Возможно подходы

  • фабрики
  • двойная отправка (может ли это использоваться для генерации идентичности?)
  • генерация внутри репозитивов
  • генерация внутри инфраструктуры (например, ORM или базы данных)
  • службы впрыска в сущности
2 6

2 ответа:

Я бы поместил его на фабрике. Генерация id не должна быть частью логики домена, на мой взгляд, потому что это действительно вопрос инфраструктуры. Вы можете взять id из БД или сгенерировать его с помощью uuid или еще чего-нибудь. Это мелочь. Также помните, что к доменному слою относится только интерфейс фабрики, а не ее реализация.

О ваших сомнениях для фабрики, Если вы используете фабрику для создания сущностей, то вы должны использовать ее везде. Вот как я это делаю.

Вон Вернон автор реализации доменного дизайна выступает за создание уникальных идентификаторов в репозиториях следующим образом:

   public TenantId nextIdentity() {
        return new TenantId(UUID.randomUUID().toString().toUpperCase());
    }

TenantId является ценностным объектом, который заключает в себе идентичность сущности.