2015-10-26 1 views
0

В структуре 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 вызывает непоправимое исключение с нарушением ограничений, или я ошибаюсь?

+2

Очень хорошая практика отправки объекта команды в службу. –

+0

@JoshuaMoore спасибо за советы, я отредактировал свой вопрос и задал конкретный случай с объектом команды, и ваш совет будет интересным. – Nico

+1

Я думал, что целью командного объекта было выполнение привязки данных и обертка http-запроса в объект, а не неявные параметры. На мой взгляд, уровень сервиса не должен знать о командных объектах, а скорее бизнес-объектах, которые могут быть либо вашими Доменами, либо DTOS, которые используются уровнем dao для фактического обновления объектов.Представьте, что уровень сервиса, который подвергается и повторно используется в Enterprise другими клиентами, эти клиенты могут не быть формой, поэтому не имеют доступной Command, но они могли бы, вероятно, вызвать эту службу, передав User или UserDto. Есть предположения? – Viriato

ответ

2

Это лучший способ передать параметры запроса на сервисный уровень. Я видел людей, которые передавали параметры для службы, что на самом деле является худшей практикой. Наши контроллеры должны быть дампами, Max 5-8 LOC в методе контроллера является ориентиром в моей компании.

объект Command дает вам так много энергии из коробки, как проверки, метод и т.д.

+0

Спасибо Uday, я отредактировал свой вопрос с конкретным случаем, если у вас есть совет по нему, будет рад – Nico

0

Ограничения, как единственный, который должен подтверждено из базы данных не может быть применен на объект команды. В этом случае вы можете использовать валидатор http://grails.github.io/grails-doc/2.5.1/ref/Constraints/validator.html.

Вы также можете использовать ограничение importFrom, чтобы иметь всю форму ограничения. Пользовательский домен должен командовать объектом http://grails.github.io/grails-doc/2.5.1/guide/validation.html.

+0

Я сделал это, но что, если я проверил свой объект команды с cmd.hasErrors(), вернет true (cmd.email = "[email protected]"), но затем, когда я решаю вызвать userService.saveMyUser (cmd), другой пользователь только что сохранил в базе данных адрес электронной почты [email protected] Когда моя транзакция завершится, flush в базу данных, вероятно, вызовет исключение, потому что я пытаюсь вставить [email protected], но он уже находится в базе данных. Надеюсь, мой пример ясен. – Nico

+0

, потому что в базе данных будет два запроса: первый для уникального: истинный по электронной почте, а второй - в конце транзакции при потоке пользователя в базу данных. – Nico

+0

жаль, что я имел ввиду cmd.hasErrors() return false, и userService нашел ошибки – Nico

 Смежные вопросы

  • Нет связанных вопросов^_^