2016-03-08 9 views
0

У меня есть RegisterUserCommand с некоторыми пользовательскими данными.Лучшее место для извлечения данных сторонних разработчиков в ES/CQRS

Чтобы иметь возможность зарегистрировать пользователь с некоторой дополнительной информацией, мне нужно подключить к 3-й партии, так что мой вопрос:

1) Если Команда уже есть все эти данные третьей стороной при вызове?

2) Было бы хорошо, если CommandHandler подключится к третьей стороне и получит ее?

3) Я не думаю, что мой общий корень должен делать это, но в некотором смысле это логика домена.

Я думаю, что # 2 - лучший способ, но хотелось бы услышать, если я ошибаюсь в этом или нет?

(фактический случай не регистрирует пользователя, но для этого нужно получить данные из удаленной службы/третья сторона)

+1

Необходима ли информация на 100%, чтобы добавить пользователя в ваш домен, тогда обработчик команды должен получить информацию. Если нет, добавьте пользователя в домен и пусть событие «UserCreated» извлечет данные. – janhartmann

+0

Да, сторонние данные имеют решающее значение на данном этапе. BTW. Как я могу это сделать по событию? Я имею в виду, arent-команды (или фактически обработчики команд) только те, которые должны менять агрегаты? – Miro

+0

Не могли бы вы предоставить код? Как бы то ни было, этот вопрос очень неоднозначен. – theMayer

ответ

0

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

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

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

Как правило, долговечный обмен сообщениями также имеет некоторые возможности повтора, которые уменьшают риск запроса, сделанного во внешнем ограниченном контексте, сбой.

0

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