Использование командных объектов в Grails для обновлений - PullRequest
2 голосов
/ 01 марта 2011

Я прочитал, что сервисы используются для обновлений в нескольких классах домена. Тем не менее, у меня есть классы команд, и я хотел бы знать, имеет ли существенная обратная сторона логика, которая делает обновления транзакций в классе команд (или нарушает парадигму Grails). Что-то вроде:

class ObjectOneCommand {
...
    def save() {
        objectOneInstance.save()
        objectTwoInstance.save()
    }
}

А в контроллере

ObjectOne.withTransaction { transactionStatus ->
    objectOneCommand.save()
}

Ответы [ 3 ]

4 голосов
/ 01 марта 2011

Я только новичок в Grails, но насколько я понимаю, командный объект - это в основном умный способ связывания данных для входящих параметров, чтобы вы могли проверить их дальше или, возможно, выполнить некоторую обработку для них. По сути, он берет проверки ограничений модели домена из самого класса домена и массирует свойства, прежде чем они передаются объекту домена для сохранения (часто через службу).

Таким образом, объекты команд (для меня в любом случае) не являются местом для бизнес-логики транзакций на объектах домена.

Кроме того, поскольку сервисы могут быть внедрены в другие классы, таким образом вы можете повторно использовать бизнес-логику в сервисах. Если вы размещаете свою логику в объектах команд, внедрение зависимостей для вас не вариант, и вы можете в конечном итоге дублировать логику среди различных объектов команд.

Так что, поскольку вы можете внедрять службы в свои командные классы, я думаю, для вас может иметь смысл пойти по этому пути.

0 голосов
/ 26 ноября 2013

Перейдите по этой ссылке, где автор, Дэвид Доусон, предлагает использовать объекты команд для моделирования входящих запросов и поддержания состояния в течение всего срока действия запроса.Я не уверен, хорошая это или плохая идея, но она очень похожа на то, что вы описываете.

http://www.simplicityitself.com/article/all-hail-command

0 голосов
/ 02 марта 2011

Вообще говоря, это против парадигмы Грааля, а также против большинства парадигм MVC.Как отметил Кьяран, логика, которую вы вводите в классы Command и Controller, не может использоваться повторно.Вы не сможете вызывать его с других контроллеров (легко), поэтому вам, вероятно, придется переписывать его снова и снова.Если бы в вашем распоряжении был метод, позволяющий сделать это постоянным, с def transactional = true было бы намного лучше.

...