2010-01-23 48 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接口让用户从选择可扩展的实现列表。

相关问题