2010-01-23 46 views
1

假設我想定義一個接口FooProvider,然後在運行時有多個此接口的實現(可能作爲單獨的服務)。在我的控制器類中,我希望能夠在運行時注入此接口的所有已知實現,以便我可以將它們作爲「選項」公開給用戶以獲取不同類型的「Foo」項。這將允許我的服務器端代碼更加模塊化,並允許多人定義插入FooProvider服務的不同方式。如果我想在Grails中擁有自己的插件架構,該怎麼辦?

從我看到的情況來看,Grails只允許我在控制器/域類中注入服務實現的單個實例。有沒有辦法讓Grails根據接口類型注入多個服務實例?我想我與OSGi的注入OSGi容器中提供的接口實現的能力並行......有什麼想法?

回答

1

Grails在下面使用Spring,所以如果您瞭解Spring,您可以根據需要向控制器注入儘可能多的服務。

但我會考慮一個可能的理由不這樣做。當您開始將多個服務放入控制器時,控制器會接管它們的調用順序。這聽起來像是一個工作流程,最好留給服務。

控制器是Web層的一部分。如果它隱藏在控制器中,則不能將該進程公開給通過除Web層之外的另一個通道進入的客戶端。

我建議你不要這樣做,即使這是可能的。一個更好的主意是揭示在另一個服務中聽起來像是一個複雜的用例。封裝它並隱藏客戶的詳細信息。這就是對象的目的 - 隱藏複雜性。

+0

不夠公平。那麼,如果我想將所有實現注入到門面服務中呢?假設我希望服務只是通過插件提供程序向我提供所有「Foo」,並讓用戶選擇他們想要的哪些「Foo」項目......在我的grails層次結構中,我可以定義要注入什麼服務?謝謝你的提示! – Mike 2010-01-23 15:45:11

1

排序什麼,我覺得你瞄準......我建立了一個提供定製神器插件(稱之爲美孚),並提供了一個腳本,讓開發作出新的實例(MyFoo,YourFoo)和我有工件模板擴展基類(可以實現一個接口)。然後,當Grails開始時,它會找到所有Foo構件,並在我的FooService中有一個方法getFooList(),它只是返回「application.getFooClasses()」...在FooController中,我得到該列表並傳遞到UI以填充選區名單。用戶選擇一個名字後,FooService接口與

def clazz = ApplicationHolder.application.getFooClass(name) 
    myFoo = clazz?.newInstance() 

顯然,這實例並不保證接口或基類的每一個實現被發現,但它確實讓我FooService接口讓用戶從選擇可擴展的實現列表。

相關問題