2011-07-14 3 views
0

Я пишу службу, которая не должна ничего сохранять. Он получает некоторые значения. Выбирает несколько вещей в базе данных и затем отбрасывает ответ. Есть ли что-нибудь, что я должен сделать, чтобы сделать сервис быстрее/меньше накладных расходов? И что является лучшим способом передать ему что-то. Я обычно передаю идентификатор и получаю его снова; что это хорошо/плохо/немодно?Grails - как передать доменные объекты и использовать службы

Пример

class DoStuffController { 
    def ExampleProcessingService 
    def yesDoIt = { 
    def lookup = "findme" 
    def theObject = ExampleThing.findByLookie(lookup) 
    def lolMap = ExampleProcessingService.doYourThing(theObject.id) 
    if(lolMap["successBool"]){ 
     theObject.imaString = "Stuff" 
     theObject.save() 
    } 
    [] 
    } 
} 

службы

class ExampleProcessingService{ 
    static transactional = true //???????? false? not-a? 
    def doYourThing = {theID -> 
    def returnMap = [:] 
    def myInstance = ExampleThing.get(theID) 
    if(myInstance.something)returnMap.put "successBool", true 
    else returnMap.put "successBool", false 
    return returnMap 
    } 
} 

объект домена

class ExampleThing { 

    String imaString 
    String lookie 
    static constraints = { 
    imaString(nullable:true) 

    } 
    def getSomething() { 
    return true 
    } 
} 

самозагрузки

import learngrails.* 
class BootStrap { 

    def init = { servletContext -> 
     def newThing = new ExampleThing(lookie:"findme") 
     newThing.save() 
    } 
    def destroy = { 
    } 
} 

Является ли преимуществом, недостатком или стандартом для передачи идентификатора и получения доступа к передаче объекта? Изменилось ли это изменение, когда я не собирался ничего спасти в сервисе? Есть ли что-то, что я делаю нелепо? У вас есть лучшее предложение для названия?

ответ

2

Вы задали много вопросов и должны разделить это на несколько отдельных вопросов. Но я рассмотрю общую проблему - этот подход в целом хорош.

Там не много накладных расходов в открытии и совершении сделки, которая не делает каких-либо баз данных настойчивость, но это расточительно, так что вы должны добавить

static transactional = false 

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

Одна вещь - делать не использовать закрытие в сервисах. Они требуются в контроллерах и taglib (до 2.0 в любом случае), но их всегда следует избегать в службах и других классах. Если вы не используете тот факт, что это закрытие, то есть передача его как объекта методу в качестве параметра или его делегирования и т. Д. - тогда вы просто слишком хороши. Если вы называете его как метод, сделайте его методом. Реальный недостаток в закрытии сервисов заключается в том, что, когда вы хотите, чтобы они были транзакционными, их не может быть. Это связано с тем, что вызовы метода перехвата Spring перехватывают, а не вызовы закрытия, которые Groovy притворяется, - это вызовы методов. Таким образом, перехвата транзакций, безопасности и т. Д. Не будет.

+1

Я согласен с @ burt-beckwith и хочу добавить, что нет причин передавать идентификатор домена службе, просто чтобы сделать другой поиск вашего объекта, я бы передал сам объект, если у вас нет действительно веской причины не делать этого. – sbglasius

+0

Я принимаю это, поскольку поток, кажется, умер, и этот ответ действительно помог. – Mikey

+0

Спасибо, бур! Я попытался воспроизвести не-транзакционное поведение для закрытия сервисов. Но не мог. Пример кода, который я тестировал, можно найти здесь: http: //pastebin.com/9L4jzMp3. Любая помощь будет оценена по достоинству. –

Смежные вопросы