2010-05-11 74 views
5

我需要基於域的屬性注入服務,到目前爲止,我想出了以下內容:的Grails:動態域類注射服務

ApplicationHolder.application.getServiceClass("package.${property}Service").clazz 

,但這種方式裝填不注它的相關服務。我做錯了嗎?

回答

15

新實例將繞過Spring的依賴管理;您需要從應用程序上下文獲取配置的單例bean。使用這個來代替:

def service = ApplicationHolder.application.getMainContext().getBean("${property}Service") 

這假定「財產」是一種服務,即對於FooBarService部分bean的名字,屬性必須是「Foobar的」。如果是「fooBar」的,那麼你可以使用GrailsNameUtils.getPropertyName()來解決這個問題:

import grails.util.GrailsNameUtils 

String beanName = GrailsNameUtils.getPropertyName(property) + 'Service' 
def service = ApplicationHolder.application.getMainContext().getBean(beanName) 
+0

耶,它的工作原理。我嘗試了getBean方法,但是傳遞了'FooBar':) :) – rukoche 2010-05-12 10:25:07

+0

上面的代碼在我用'.getMainContext()替換'.getMainContext.'時並不適用於我。' – sebnukem 2013-05-21 15:33:53

+0

謝謝,我在看到你的代碼後修復了它編輯被錯誤地拒絕 – 2015-04-15 05:45:16

0

是的。服務不會注入到域對象中。如果您的域對象需要特定用例的某些內容,請讓擁有該用例的服務代表域對象調用其他服務。

+2

任何Spring bean都可以像控制器一樣注入到域類中,即「def fooService」。常見的用例是在自定義驗證器中調用服務。 – 2010-05-11 20:44:11

+0

可以;我只是不同意它應該是。驗證程序與帳戶或人員等域對象不同。這是一個完全不同的用例。 – duffymo 2010-05-11 20:52:57

3

恕我直言域類不應該包含所有的邏輯(除了形成的驗證)。

在我的項目我通常創建爲每個域類(例如UserService類用戶)服務和我粘在那裏所有的邏輯,即使是小位件通常會處於域類。

我想很多來自Java/C++世界的程序員往往會覺得這很醜陋,但它更適合Grails架構。

+3

的確,Grails領域類並不真的適合邏輯,但這是一個恥辱,因爲我必須同意Fowler的這一點:http://en.wikipedia.org/wiki/Anemic_Domain_Model – Kimble 2010-09-22 13:06:11

+1

確實,埃裏克埃文斯可能會感覺到一股力量的混亂,當時有人說「領域類別不應該包含任何邏輯」。這聽起來像是一個Domain對象的反模式,完全與Domain驅動的設計相反。 – 2011-04-13 19:40:12

+0

在我的情況下,我想設置一個基於grails環境的索引TTL。什麼是更好的模式呢? – Kirby 2016-03-18 14:33:24