Использование доменных событий - это широко одобренная практика для приложений DDD, но есть сценарии, которые кажутся мне сложными.Домены в доменном дизайне скрывают намерение?
Недавно я работал над приложением, в котором бизнес-логика требовала, чтобы при создании нового пользователя этот пользователь также был создан в трех отдельных подсистемах. Таким образом, в основном, если вы используете подход сценария транзакции это будет выглядеть примерно так:
public void CreateUser()
{
CreateUserInSystemA();
CreateUserInSystemB();
CreateUserInSystemC();
}
подход, который я смотрел был с помощью доменных событий, поэтому точка входа выглядела примерно так:
public void CreateUser()
{
CreateUserInSystemA();
}
Тогда CreateUserInSystemA
бы поднять событие домена, когда пользователь был создан. Тогда обработчик для этого события создаст пользователя в системе B, поднимет еще одно событие домена и запустит другой обработчик, который создаст пользователя в системе C. Все это было настроено во время регистрации контейнера DI, так что это было довольно сложно.
Так что вопрос:
1) Не такой подход эффективно скрывает логику предметной области? Это непросто, если посмотреть на метод CreateUser, чтобы увидеть, что мы действительно делаем.
2) Что делать, если (как это произошло в нашем случае), у вас будет новый рабочий процесс, где вам просто нужно создавать пользователей в системах A и B, - поэтому CreateUserInSystemC
не следует вызывать? Если бы мы использовали существующую реализацию CreateUserInSystemB
, она увеличит событие домена, а проводная CreateUserInSystemC
будет работать независимо.
Каков наилучший подход для обработки этого сценария в правильном режиме DDD? Должен ли мы использовать уровень Application Service и просто выставлять два отдельных метода для обоих рабочих процессов и не основывать поток на событиях домена?