如果我想在Grails中拥有自己的插件体系结构呢?

如果我想在Grails中拥有自己的插件体系结构呢?,grails,dependency-injection,plugins,service,Grails,Dependency Injection,Plugins,Service,假设我想定义一个接口FooProvider,然后在运行时提供该接口的多个实现(可能作为单个服务)。在我的控制器类中,我希望能够在运行时注入该接口的所有已知实现,以便可以将它们作为“选项”公开给用户,以获取不同类型的“Foo”项。这将使我的服务器端代码更加模块化,并允许多人定义插入FooProvider服务的不同方式 在我看来,Grails只给了我在控制器/域类中注入单个服务实现实例的选项。Grails是否有办法基于接口类型注入多个服务实例?我想这与OSGi注入OSGi容器中可用接口实现的能力是并

假设我想定义一个接口FooProvider,然后在运行时提供该接口的多个实现(可能作为单个服务)。在我的控制器类中,我希望能够在运行时注入该接口的所有已知实现,以便可以将它们作为“选项”公开给用户,以获取不同类型的“Foo”项。这将使我的服务器端代码更加模块化,并允许多人定义插入FooProvider服务的不同方式


在我看来,Grails只给了我在控制器/域类中注入单个服务实现实例的选项。Grails是否有办法基于接口类型注入多个服务实例?我想这与OSGi注入OSGi容器中可用接口实现的能力是并行的……有什么想法吗?

Grails在底层使用Spring,因此如果您了解Spring,您可以向控制器中注入任意数量的服务

但我会想一个不这么做的好理由。当您开始将多个服务放入一个控制器时,控制器将接管它们的调用顺序。在这一点上,对我来说,这听起来像是一个工作流,最好由服务来完成

控制器是web层的一部分。如果该进程隐藏在控制器中,则不能将其公开给通过web层以外的另一个通道进入的客户端


我建议你不要这样做,即使这是可能的。更好的办法是在另一个服务中公开听起来像复杂用例的内容。封装它并对客户端隐藏详细信息。这就是对象的用途——隐藏复杂性。

我认为你的目标是。。。我构建了一个插件,它提供一个自定义工件(称之为Foo),并提供一个脚本,让开发人员创建新实例(MyFoo,YourFoo),我让工件模板扩展一个基类(可以实现一个接口)。然后,当Grails启动时,它会找到所有的Foo工件,在我的FooService中,我有一个方法getGoogleist(),它只返回“application.getFooClasses()”。。。在FooController中,我获取该列表并传递到UI以填充选择列表。用户按名称选择一个后,FooService使用

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

显然,这并不能确保找到接口或基类的每个实现,但它确实让my FooService让用户从可扩展的实现列表中进行选择。

。那么,如果我想将所有实现注入一个facade服务呢?假设我希望该服务只是通过插件提供程序向我提供所有可用的“Foo”,并让用户选择他们想要的“Foo”项……在我的grails层次结构中,我在哪里定义了要注入服务的内容?谢谢你的提示!