Подтвердить что ты не робот

Grails: услуги VS Groovy классы

Документация гласит:

Команда Grails отбивает внедрение логики основного приложения внутри контроллеров, поскольку он не содействовать повторному использованию и чистому разделению проблем.

У меня есть один контроллер API и несколько классов Groovy в папке src/groovy. Эти классы просто реализуют мою прикладную логику, поэтому действия в контроллере API работают следующим образом:

//index page
def index = {
    render new IndexApi().index(params) as JSON
}

Мне любопытно - есть ли какие-либо причины для переноса моей логики приложений из простых классов Groovy в службы?

4b9b3361

Ответ 1

Если вам требуется транзакционное поведение, вы должны поместить свою логику в Службы. Иначе вам придется позаботиться об этом самим, что не в духе использования Grails.

Я не являюсь экспертом по grails, я помещаю свои "не транзакционные" классы за уровень сервиса, такие как классы-конструкторы, помощники и другую логику, которая не является транзакционной, но используется с уровня сервиса.

Ответ 2

На самом деле услуги связаны не только с транзакциями. Службы отлично подходят для одноконтактных компонентов с нулевой конфигурацией, и их можно перезагрузить без перезапуска всей среды Grails. И они могут быть обнаружены как артефакты и, следовательно, автоматически открыты с удаленными плагинами.

Ответ 3

Существует три причины:

  • Это делает контроллер меньшим → легче понять и поддерживать

  • Это облегчает вам проверку логики.

  • Вы действительно не хотите управлять своими транзакциями вручную.

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

Например, для тестирования JSP требуется HTTPRequest. Для запроса вам нужна HTTPSession и JSPWriter. Им нужен контекст сеанса. Поэтому, чтобы иметь возможность запускать один тест, вам нужно настроить и инициализировать целую группу классов. И все это интерфейсы, а реализации - частные. Таким образом, вы должны сами реализовать фактические методы (все 300 из них). И вам лучше получить это право или ваши тесты не будут проверять, что вы хотите.