2013-04-25 2 views
1

Использование доменных событий - это широко одобренная практика для приложений 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 и просто выставлять два отдельных метода для обоих рабочих процессов и не основывать поток на событиях домена?

ответ

1

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

Таким образом, запустите событие в зависимости от отношений между вашими подсистемами. С каждой точки домена (подсистемы) другие подсистемы являются интеграционными уровнями, возможно, с их собственными моделями доменов внутри.

Таким образом, ответы на вопросы будут:

1) Нет, потому что подход полностью связан с интеграцией систем.

2) Изменения расхода требуют изменений в поведении интеграции, а не в подсистемах.

Еще одна точка: то, что я имею в виду подсистемой, аналогично услугам. У каждого домена есть служба, с которой он взаимодействует. И службы обычно связаны с взаимодействиями (SOA-система с несколькими службами является примером реализации). Кроме того, каждый домен может быть и сервисом, который, возможно, отображается через служебный уровень.

Смежные вопросы