2013-07-15 42 views
1

使用特定於環境的值配置Grails服務的最佳方式是什麼?我認爲有兩種選擇:特定於環境的Grails服務配置

  1. 從服務類中訪問grailsApplication值或
  2. 配置Config.groovy中或resources.groovy一豆關閉該服務的bean。

我見過幾個帖子在stackoverflow和其他地方,顯示如何做#1(訪問服務中的grailsApplication)。其中一個這樣的帖子是:Inject grails application configuration into service

但是,我認爲這會造成服務與Grails的不必要的耦合。這不是類似於在pojo中訪問Spring的applicationContext,而不是配置/注入值?此外,我還沒有得到任何好運,因此尚未在服務類的單元測試中工作。

兩本書都有注入屬性的例子(方法#2)。本書Grails 2權威指南第10章標題爲「服務在行動」一節展示瞭如何做到這一點,但沒有環境特定的價值。本書Groovy和Grails食譜第16-2節也展示了一個使用resources.groovy的例子,但我還沒有能夠使它工作。

以下博客文章也有一個很好的例子,但不是特定環境:http://ldaley.com/post/1253952347/getting-more-out-of-property-override-configuration。 Grails Reference的第15章也與這些示例一致,並說明如何在每個環境基礎上設置bean上的屬性。

但是,任何一種方法的例子都不能以任何方式給出任何意見或理由。這兩種方法真的沒有優點和缺點嗎?注入方法不會更容易進行單元測試,並且更符合春季做事的方式嗎?

Nathan

回答

1

我會說使用哪一個你更舒服。我傾向於直接從服務中訪問grailsApplication.config,因爲這樣可以使配置更「語義化」(因爲需要更好的單詞),因爲您可以在配置選項之後命名配置選項,而不是使用哪個bean他們控制。如果兩個(或更多)不同的bean需要知道站點管理員的電子郵件地址(例如),那麼他們都可以讀取grailsApplication.config.myapp.admin.email,而不必單獨配置beans.monitorService.destinationEmailbeans.userService.fromEmail

在單元測試中,您不得不模擬grailsApplication配置,因此填寫您的服務需要讀取的配置選項的測試值沒什麼大不了的。

+0

謝謝,這實際上是有道理的。最後,一些理性的方法! –

+0

從你所說的話來看,Grails發明人似乎已經在思考上發生了轉變,因爲你所描述的問題類型與重複的值在春季配置中應該是相同的值。因此,對基本上集中在grailsApplication下的配置值的引用是一個實際的改進。也許用groovy來設置比在Java中更容易,否則它也可能在Spring中成爲一個選項。 –

+0

@NathanWard覆蓋配置方法在某些情況下是非常有用的,主要是當你想要將屬性值注入到你不控制的bean(例如由插件提供的屬性值)時。 –

0

resources.groovy中定義的服務(存在於服務文件夾中的類)和Spring Beans中的概念有所不同。

services,Grails的已安裝的交易:

服務通常涉及協調 類域間的邏輯,並因此常常涉及範圍的持久化大 操作。鑑於服務的性質,他們經常需要事務性行爲 。您可以使用withTransaction方法使用 的程序化交易,但是這是重複性的,並且不會 充分利用Spring底層交易 抽象的力量。

您聲明的Spring Bean默認情況下不是事務性的。

「不過,我認爲這會在服務 的不必要的耦合中的Grails」

由於Grails服務從春天豆類不同,我沒有看到一個#使用問題的方法1。

對於單元測試,您需要手動連線服務實例。例如:

class MyService { 
    def grailsApplication 
} 

class MyServiceTests { 
    MyService getServiceInstance() { 
    MyService myService = new MyService() 
    myService.grailsApplication = grailsApplication //static attribute in unit tests 
    return myService 
    } 
} 
+0

感謝您的回覆。我仍然認爲Grails服務概念與Martin Fowler在企業架構模式中基於相同名稱模式的服務層概念相同。 –

+0

這個概念可以相同,但Grails服務和Grails Spring Bean並不相同。 –