Предположим, у меня есть команда, которая сохраняет роль приложения вместе с некоторыми разрешениями приложений. Мои роли и разрешения имеют (или будут) бизнес-правила, поэтому я буду использовать объекты домена:Как и когда гидратировать объекты домена в стеке команд CQRS
class Role {
...
IEnumerable<Permission> Permissions { ... }
AddPermission(...)
...
}
class Permission {
...
int ID { ... }
string Foo { ... }
string Bar { ... }
string Baz { ... }
}
Когда я сохранение роли, мне нужен полный объект Role и, скорее всего, получат все, что я требуется от уровня представления. Однако мне не нужны полные объекты Permission, потому что мне нужно связать их идентификатор с ролью. Мне не нужны свойства Foo, Bar и Baz.
Когда я с сохранением разрешения, мне, очевидно, нужен полный объект Permission.
Мой вопрос: Каков правильный способ обработки этого объекта Permission? Если у меня есть только один класс Permission, а затем, когда я спасаю свою роль, я буду либо:
- Have для запроса/гидратов объектов полного разрешения из базы данных и роль имеет законные объекты правы в своей коллекции, или
- Прикрепите незавершенные объекты Разрешения (только идентификаторы), чтобы избежать поездки в базу данных.
Вариант № 1 звучит как сложность команды/запроса, которую CQRS старается избегать, а # 2 звучит как недействительный объект, плавающий вокруг - я даже не хочу иметь возможность создавать недопустимые объекты, меньше использовать их.
Я мог бы также создать класс PermissionSummary и получить от него полный класс Permission. Я делал это раньше, и это неизбежно приводит к ползучести свойств от «полного» класса до «итогового» класса.
Благодарим за отзыв, но часть моего вопроса остается: где действуют бизнес-правила в вашем решении? Для (примитивного примера) в Role.AddPermission() я мог убедиться, что я не добавляю разрешение, которого еще нет в коллекции. Но в вашем решении этот класс не существует. – Seth
Да, да. По-прежнему будет класс Role с методом AddPermission. Это создаст событие PermissionAdded, если будут выполнены бизнес-правила. Посмотрите пример Simple CQRS Greg Young – tomliversidge