Граальс: Сервисы VS Groovy классы - PullRequest
19 голосов
/ 01 апреля 2010

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

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

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

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

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

Ответы [ 3 ]

20 голосов
/ 01 апреля 2010

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

9 голосов
/ 01 апреля 2010

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

Будучи не экспертом по grails, я поместил свои «не транзакционные» классы вне уровня обслуживания, такие как классы компоновщика, помощники и другая логика, которая не является транзакционной, но используется из уровня обслуживания.

8 голосов
/ 01 апреля 2010

Есть три причины:

  1. Это делает контроллер меньше -> проще для понимания и обслуживания

  2. Это облегчает тестирование логики.

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

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

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

...