Для нашего приложения MVC CQRS мы изначально начали с хранения всей информации, связанной с пользователем, в домене, и, как кто-то упомянул, были RegisterUserCommand и UserRegisteredEvent. После сохранения информации о пользователе в домене это событие было опубликовано и перехвачено на стороне чтения, что также создало пользователя и сгенерировало все хэши паролей и т. Д. Затем мы провели аутентификацию на стороне чтения: контроллер выполнял вызвать «службу проверки подлинности модели чтения» для проверки подлинности.
Позже мы закончили его полным рефакторингом. Оказалось, что нам нужен доступ к информации, связанной с пользователем, чтобы обеспечить безопасность для авторизации наших команд, что мы и сделали на стороне обработки команд (наше приложение представляет собой распределенное приложение, которое отправляет асинхронные команды «запустить и забыть» в очередь с автономный слушатель с другой стороны). Затем компоненту безопасности потребовалась ссылка на наш домен, чтобы получить профиль пользователя, что привело к обременительным проблемам со ссылками.
Мы решили поместить информацию о безопасности пользователей в отдельную базу данных, которую мы считали скорее центральным компонентом, нежели принадлежащим домену или модели чтения. Мы по-прежнему поддерживаем информацию, связанную с профилем пользователя, в домене и моделями чтения (например, название должности, URL-адрес учетной записи Twitter и т. Д.), Но все связанные с безопасностью вещи, такие как хэши паролей, хранятся в этой центральной базе данных. Затем это становится доступным с помощью службы, доступной как для MVC, так и для авторизатора команд.
На самом деле нам не пришлось ничего менять в пользовательском интерфейсе для этого рефакторинга, поскольку мы просто вызвали службу для регистрации пользователей из обработчика команд register user. Если вы собираетесь сделать это таким образом, вам нужно быть осторожным, чтобы сделать операции, связанные с пользовательскими сервисами, идемпотентными. Это сделано для того, чтобы вы могли дать своим командам возможность повторить попытку без побочных эффектов, потому что вы обновляете 2 источника информации (ES и пользовательская база данных).
Наконец, вы, конечно, можете использовать поставщиков членства для этого центрального компонента, но может быть подводные камни с этим. В итоге мы просто написали свой - это довольно просто. В этой статье есть ссылка на this, который представляет собой хороший пример того, как это реализовать.
person
jacderida
schedule
27.03.2013