Grails: классы Services VS Groovy

В документации говорится:

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

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

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

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


person Oleksandr    schedule 01.04.2010    source источник


Ответы (3)


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

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

person HeDinges    schedule 01.04.2010

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

person Marc Palmer    schedule 01.04.2010

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

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

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

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

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

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

person Aaron Digulla    schedule 01.04.2010