TLDR;Авторизация должна быть четко отделена от уровня домена, например, в другом пакете / пространстве имен / модуле.Кроме того, зависимость от Домена до Авторизации должна быть инвертирована, Домен не должен зависеть / знать об авторизации /
Один из способов реализовать это - создать сервис Авторизации, например FindByCourseIdAndStudentIdQueryAuthorizer
(давайтеназовите это Authorizer).Эта услуга может пересекать границы ограниченного контекста (BC), то есть она может зависеть от услуг удаленного домена от удаленных BC.В идеале, удаленные данные должны быть уже доступны, когда авторизатор выполняет проверку.Таким образом, система становится более устойчивой в случае, если удаленные службы ограниченного контекста недоступны.Вы можете сделать это, прослушивая удаленные события или фоновые задачи.
В идеале, уровень домена (из любого BC) не должен знать об Авторизаторах.
Один из способов сделать это - украсить QueryDispatcher (или что у вас есть) в корне Composition приложения с помощью AuthorizedQueryDispatcher.Этот AuthorizedQueryDispatcher при получении запроса сначала ищет Авторизатора, а затем вызывает его.Если авторизация не пройдена, запрос отклоняется.Если авторизация прошла успешно или нет авторизатора, тогда запрос отправляется реальному / оформленному QueryDispatcher.
Если не можете этого сделать (т.е. у вас нет QueryDispatcher), тогда вы можете попытаться украсить каждыйобработчик запросов (вручную?).Например, у вас может быть FindByCourseIdAndStudentIdAuthorizedQueryHandler
, который имеет тот же интерфейс, что и FindByCourseIdAndStudentIdQueryHandler
.Вы можете заменить их в корне композиции приложения (DIC).