2011-07-14 22 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 = { 
    } 
} 

傳遞ID和傳遞對象的優點,劣勢還是標準?這種變化是否因爲我的情況不會在服務中保存任何東西?我在做什麼明顯錯誤?你對標題有更好的建議嗎?

回答

2

你問了很多問題,應該把它分成幾個單獨的問題。但我會解決整體問題 - 這種方法一般都很好。

有沒有啓動和提交不會做任何數據庫持久事務的開銷很大,但它是一種浪費,所以你應該添加

static transactional = false 

在這種情況下,您使用的類作爲一個容易注入的單身助手類。在服務中進行事務處理很方便,因爲它們是自動事務處理的,但是它遠沒有要求。

雖然有一件事 - 做不是在服務中使用閉包。它們在控制器和taglibs中是必需的(直到2.0),但在服務和其他類中應始終避免它們。如果你沒有使用它是一個閉包的事實 - 即將它作爲一個對象傳遞給一個方法作爲參數,或者設置它的委託等 - 那麼你只是太方便了。如果你把它稱爲一種方法,那就把它變成一種方法。服務中關閉的真正缺點是,當你希望它們是事務性的時,它們是不可能的。這是因爲Spring攔截器攔截方法調用,而不是Groovy假裝的方法調用的閉包調用。所以不會有任何攔截交易,安全等

+1

我同意@ burt-beckwith,並希望補充說,沒有任何理由將域ID傳遞給服務,只是爲了進行其他查找你的對象,我會傳遞對象本身,除非你有一個非常好的理由不這樣做。 – sbglasius

+0

我接受這個線程似乎已經死了,這個答案確實有幫助。 – Mikey

+0

謝謝伯特!我試圖重現服務中關閉的非交易行爲。但不能。我測試過的示例代碼可以在這裏找到:http://pastebin.com/9L4jzMp3。任何幫助,將不勝感激。 –