Использование командных объектов в Grails для обновлений

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

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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам