我需要基於域的屬性注入服務,到目前爲止,我想出了以下內容:的Grails:動態域類注射服務
ApplicationHolder.application.getServiceClass("package.${property}Service").clazz
,但這種方式裝填不注它的相關服務。我做錯了嗎?
我需要基於域的屬性注入服務,到目前爲止,我想出了以下內容:的Grails:動態域類注射服務
ApplicationHolder.application.getServiceClass("package.${property}Service").clazz
,但這種方式裝填不注它的相關服務。我做錯了嗎?
新實例將繞過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)
是的。服務不會注入到域對象中。如果您的域對象需要特定用例的某些內容,請讓擁有該用例的服務代表域對象調用其他服務。
任何Spring bean都可以像控制器一樣注入到域類中,即「def fooService」。常見的用例是在自定義驗證器中調用服務。 – 2010-05-11 20:44:11
可以;我只是不同意它應該是。驗證程序與帳戶或人員等域對象不同。這是一個完全不同的用例。 – duffymo 2010-05-11 20:52:57
恕我直言域類不應該包含所有的邏輯(除了形成的驗證)。
在我的項目我通常創建爲每個域類(例如UserService爲類用戶)服務和我粘在那裏所有的邏輯,即使是小位件通常會處於域類。
我想很多來自Java/C++世界的程序員往往會覺得這很醜陋,但它更適合Grails架構。
的確,Grails領域類並不真的適合邏輯,但這是一個恥辱,因爲我必須同意Fowler的這一點:http://en.wikipedia.org/wiki/Anemic_Domain_Model – Kimble 2010-09-22 13:06:11
確實,埃裏克埃文斯可能會感覺到一股力量的混亂,當時有人說「領域類別不應該包含任何邏輯」。這聽起來像是一個Domain對象的反模式,完全與Domain驅動的設計相反。 – 2011-04-13 19:40:12
在我的情況下,我想設置一個基於grails環境的索引TTL。什麼是更好的模式呢? – Kirby 2016-03-18 14:33:24
耶,它的工作原理。我嘗試了getBean方法,但是傳遞了'FooBar':) :) – rukoche 2010-05-12 10:25:07
上面的代碼在我用'.getMainContext()替換'.getMainContext.'時並不適用於我。' – sebnukem 2013-05-21 15:33:53
謝謝,我在看到你的代碼後修復了它編輯被錯誤地拒絕 – 2015-04-15 05:45:16