В структуре Grails я видел шаблон объекта команды, но его использование для меня не очень ясное. Кроме того, большинство примеров, приведенных в документации Grails, относятся к классам домена, а не к командам (возможно, для упрощения примера кода).Командный объект только в контроллере или он может быть передан на уровень обслуживания?
1 - Объект Command - это что-то, что используется между слоем представления и контроллера и должно оставаться там?
2 - Или это хорошая практика передать командный объект на уровень обслуживания?
Чтобы проиллюстрировать пункт 2:
class MyController {
def updateUserPassword (UserPasswordCommand cmd) {
...
myService.updatePassword(cmd)
...
}
}
Если точка 2 является плохой практикой, то как вы передаете представленные данные на уровень сервиса? Через класс домена? EDIT: Кажется OK
[EDIT]
Если я использую объект команды, а не домен класс, что делать в этом случае:
def signup(UserCreateCommand cmd)
{
if (!cmd.hasErrors()) {
def userInstance = userService.signup(cmd)
}
}
if (cmd.hasErrors()) {
/* Stay on form in order to display errors */
render(view:"/app/authentication/_signupForm", model:[userCreateCommand: cmd])
return
}
...
}
, что произойдет, если когда сделка абонентской заканчивается ли исключение, наложенное на базу данных (из-за сброса данных, не связанных с ограничениями схемы)?
Проблема в моей точки зрения, что есть два запроса:
Во-первых - когда cmd.hasErrors вызова() существует настоятельная призыв уникального ограничения по электронной почте, например
Во-вторых - когда завершение транзакции сервиса, есть флеш для БД (в результате чего в моем случае есть одна вставка SQL), и, возможно, возникает исключение из электронной почты столбца, которое имеет уникальное ограничение
Тест cmd.hasErrors() не мешает где DB вызывает непоправимое исключение с нарушением ограничений, или я ошибаюсь?
Очень хорошая практика отправки объекта команды в службу. –
@JoshuaMoore спасибо за советы, я отредактировал свой вопрос и задал конкретный случай с объектом команды, и ваш совет будет интересным. – Nico
Я думал, что целью командного объекта было выполнение привязки данных и обертка http-запроса в объект, а не неявные параметры. На мой взгляд, уровень сервиса не должен знать о командных объектах, а скорее бизнес-объектах, которые могут быть либо вашими Доменами, либо DTOS, которые используются уровнем dao для фактического обновления объектов.Представьте, что уровень сервиса, который подвергается и повторно используется в Enterprise другими клиентами, эти клиенты могут не быть формой, поэтому не имеют доступной Command, но они могли бы, вероятно, вызвать эту службу, передав User или UserDto. Есть предположения? – Viriato