Теперь мой вопрос: если я хочу проверить, находится ли пользователь, который сделал запрос, в той же группе, что и устройство, к которому применяется запрос, действительно ли мне нужно запрашивать другой агрегат?
В некотором роде.
Основная дисциплина агрегатов заключается в том, что агрегаты отвечают за изменение своего собственного состояния.Информация, которую они используют для изменения своего собственного состояния, является их предыдущим состоянием, и информация, передаваемая им в качестве аргументов.
Так что, если вы хотите запросить домен, узнайте, например, еслипользователь является членом нужных групп, тогда вы обычно делаете это, передавая запрос к Resource
в качестве одного из аргументов команды.
Обычный шаблон для передачи запроса - «домен».service "- мы собираемся передать агрегату интерфейс, поддерживающий некоторый запрос, и освободить агрегат от ответственности за его реализацию.
Resource::updateResource(Command c, PermissionsService p) {
if (p.hasPermission(c.userId, c.deviceId)) {
...
}
}
Простая реализация PermissionsService может просто вытянуть необходимуюсостояние из репозиториев.
Быстрее сделать это внутренне в аггерате, чем выдавать команду другому агрегату.
Я подозреваю, что бывают случаи, когда эффективная загрузка и хранение данных не укладываются в аккуратные совокупные границы.Я уверен, что вы должны избегать подобных проблем из логики домена самих агрегатов, но это не значит, что вы не можете заменить стратегию загрузки чем-то более эффективным.
Я думаю об этомспособ: PermissionsService будет необходимо получить доступ к копии отношений между устройством и группами.Мы не изменяем эти отношения, поэтому мы работаем с кэшированной копией.Это означает, что мы можем, по нашему усмотрению, заполнить кэш представлениями, которые, как мы ожидаем, будут полезны , прежде чем передавать этот кэш логике домена для реальной работы.
Примечание: как только выначав думать о кэшировании данных, вы начинаете понимать, что ваши вызовы в другие агрегаты могут быть временными запросами.«Сейчас» субъективно, но «когда ваши часы сказали время t», это не так.Таким образом, ваш код запроса может действительно выглядеть как
Resource::updateResource(Command c, PermissionsService p) {
Time time = ...
if (p.hasPermission(c.userId, c.deviceId, time)) {
...
}
}
С трех логикой состояний в ваших запросах
- У меня есть доступ к представлению, действующему в то время,и ответ да
- У меня есть доступ к представлению, действующему в то время, и ответ нет
- У меня нет доступа к представлению, действующему в то время