Из того, что я вижу, User
, Employee
и Employer
- Совокупные корни (AR).
В порядке ли этот код и мой подход согласно DDD?
В DDD не рекомендуется, чтобы агрегат имел ссылки на другие агрегаты, отличные от , по идентификатору .Ваши Employee
и Employer
AR имеют такую плохую ссылку, так что это не нормально.Вместо этого Employee
и Employer
должны содержать только поле UserId
.
Должен ли я извлечь создание сотрудника в службу домена?Или может быть заводской?И если так, я должен вызвать метод хранилища оттуда?(Я имею в виду услугу, конечно)
Из того, что я вижу, у вас сложный процесс создания нескольких агрегатов.В DDD вы не можете сделать это атомарно, внутри одной транзакции.Вместо этого каждый Агрегат создается / мутирует в своей собственной транзакции.Однако существует тактическая схема координации длительного процесса: Saga / Process manager.
Вы должны определить процесс регистрации сотрудника в качестве Saga: RegisterEmployee
.Этот процесс должен иметь интерфейс с этими методами: create
, start
, continue
.Метод create
получает все данные, необходимые для запуска процесса.Метод start
пытается выполнить отдельные шаги (например, createEmployee, createUser и т. Д.);если метод start
будет запущен снова, он должен продолжить с того места, где остановился, поэтому Сага должна записать свой статус.
Архитектуру можно улучшить, сделав команду для Агрегатов как идемпотентную.Таким образом, когда Сага перезапускается, она может снова отправить все команды Агрегатам;это фактически делает Saga очень простым.
Допустим, следует извлечь создание сотрудника из службы домена.Должен ли я создать пользователя внутри себя тогда?
Эта доменная служба фактически является сагой из предыдущего шага.Однако Сага не должна содержать логику, которая принадлежит Агрегатам!Будьте осторожны, чтобы не сделать вашу модель домена анемичной.Сага должна содержать только координирующую логику!
И последний вопрос: где находится правильное место для проверки, существует ли пользователь, которого я хочу создать, или нет?Является ли служба приложений подходящим местом для этого?
Что означает, что пользователь уже существует?Уже есть пользователь с таким именем?Если да, то самое простое решение - по возможности иметь уникальный индекс в столбце username
.Если это невозможно (т. Е. У вас включен шардинг), у вас может быть другая Saga, которая проверяет дубликаты и сообщает администратору или что-то в этом роде.