Генерации идентификаторов для лица в ДДД
Edit
Чтобы еще больше прояснить мою первоначальную проблему, я переписал вопрос с большим количеством " DDD " -Термини, общих шаблонов и аргументов для обсуждения. Исходную версию можно найти в разделе revisions.Где и как тождества для сущностей/aggregate корни генерируются внутри домена при правильном применении DDD?
Мне нужно присвоить уникальные идентичности моим сущностям, либо при создании, либо при сохранении. Те идентичности могут быть представлены в нескольких стилях
- вычисляется (исходя из характеристик объекта, следовательно, исходя из бизнес-требований)
- естественный (основанный на определенном наборе правил, следовательно, основанный на бизнес-логике)
- суррогаты (основанные на случайно сгенерированных значениях без бизнес-смысла)
Существует множество подходов к задаче генерации и присвоения тождеств, начиная с использования фабрик для создания тождеств, делегирования инфраструктура, использующая ORM или генерацию баз данных и т. д. Однако, если правильно применять DDD, где и как должны генерироваться идентичности, учитывая, что мы не хотим анемичных доменных моделей и инъекции сервисов в сущности ?
Требования , заявленные выше
- отсутствие анемичных доменных моделей
- нет внедрения зависимостей служб в сущности
Возможно подходы
- фабрики
- двойная отправка (может ли это использоваться для генерации идентичности?)
- генерация внутри репозитивов
- генерация внутри инфраструктуры (например, ORM или базы данных)
- службы впрыска в сущности
2 ответа:
Я бы поместил его на фабрике. Генерация id не должна быть частью логики домена, на мой взгляд, потому что это действительно вопрос инфраструктуры. Вы можете взять id из БД или сгенерировать его с помощью uuid или еще чего-нибудь. Это мелочь. Также помните, что к доменному слою относится только интерфейс фабрики, а не ее реализация.
О ваших сомнениях для фабрики, Если вы используете фабрику для создания сущностей, то вы должны использовать ее везде. Вот как я это делаю.
Вон Вернон автор реализации доменного дизайна выступает за создание уникальных идентификаторов в репозиториях следующим образом:
public TenantId nextIdentity() { return new TenantId(UUID.randomUUID().toString().toUpperCase()); }
TenantId
является ценностным объектом, который заключает в себе идентичность сущности.