2011-10-29 124 views
2

假設我有10個grails服務。這些服務中的每一個都將撥打REST服務。所以,我想封裝REST代碼,以便它可以輕鬆地被10個服務所使用。grails服務層次結構

在考慮的選擇,我可以:

1)創建REST相關的代碼,其他服務或豆,並注入它的10所服務的每一個。
2)創建一個包含REST代碼的超類服務,並且所有10個grails服務擴展這個類。

我試着去選擇2,但遇到依賴注入到超類的問題。

實施例:

class SuperService { 
    def aString 
} 

class ExampleService extends SuperService { 
} 

resources.groovy:

beans = { 
    superService(SuperService) { 
     aString = "something" 
    } 
    exampleService(ExampleService) { 
    } 
} 

當我在調試器中運行此運行的集成測試,同時,我看到ASTRING的值爲空。顯然,這對我來說會有問題。

正如你所預料的,具有以下resources.groovy運行相同的代碼:

beans = { 
    superService(SuperService) { 
    } 
    exampleService(ExampleService) { 
     aString = "something" 
    } 
} 

和ASTRING = 「東西」。

所以,我更喜歡選項2,因爲它會少配置接線,但我不認爲這將是可行的方法。換句話說,如果必須在每個子類中設置一個字符串,就沒有價值。

的思考?

我錯過了什麼嗎?

我對其他選項也是開放的。

由於提前, 託德

+0

爲什麼你認爲選項2會少配置接線? –

回答

0

您有選項#2正確的觀念在被DRY方面 - 但它實際上只是一條線。如果唯一與superService對象相同的是服務,並且沒有其他方法,那麼你實際上並沒有保存任何工作。如果有的話,只要聲明一個依賴注入的超類就會讓事情更加隱藏,並且可能更難以維護。

聽起來像你建議把REST方法放在superService中,所以不確定爲什麼你關心依賴注入到superService中 - 你希望你的方法執行REST交互,而子類將會是能夠打電話。或者你是否嘗試了選項1和2的組合?

+0

在superService中,我需要訪問springSecurityService或Spring Security插件提供的util或holder對象之一。在進行其他呼叫之前,這個superSerivce需要知道誰登錄了。在星期五,我無法獲得這個超級服務來檢索任何東西......總是使用安全的NPE。我認爲我的問題是依賴注入。 –

+0

今天早上,下面的代碼在superClass中工作:def ctx = AH.application.mainContext SpringSecurityService springSecurityService = ctx.springSecurityService def loggedInUser = springSecurityService。getPrincipal() –

+0

有趣。我仍然感到驚訝的注射沒有工作到superService。你在使用Grails 2.0.RC1嗎?還是1.3.7? – Todd