是否有可能让两个服务实现相同的接口并在运行时决定在Grails中为接口注入什么服务?在Grails中注入不同的服务
例如
MyAService implements MyInterface {
...
}
MyBService implements MyInterface {
...
}
其他服务,那么就必须MyInterface的参考,您可以根据配置设置或任何确定注入什么样的服务?
是否有可能让两个服务实现相同的接口并在运行时决定在Grails中为接口注入什么服务?在Grails中注入不同的服务
例如
MyAService implements MyInterface {
...
}
MyBService implements MyInterface {
...
}
其他服务,那么就必须MyInterface的参考,您可以根据配置设置或任何确定注入什么样的服务?
Grails使用自动注入按名称进行基于约定的注入,如def fooService
,并且像启动时自动注册服务等工件。如果在resources.groovy
中配置bean及其依赖关系,并且可以使用Groovy代码来应用逻辑,则可以拥有更多控制权。
但我会保持简单,并在BootStrap.groovy
做的工作。添加公共领域(如def myService
)或私人领域和目标类的setter(如void setMyService(service) { this.myService = service }
。然后,在自举,依赖,注入所有可能的候选人和手动进正确的。喜欢的东西
class BootStrap {
def myAService
def myBService
def theDestinationBean
def init = { servletContext ->
if (<some condition>) {
theDestinationBean.myService = myAService
}
else {
theDestinationBean.myService = myBService
}
}
}
因为它是Groovy中,你可能并不需要的接口,但它不会伤害,可以给你一点编译时的安全性。
在我的项目,我用的是resources.groovy
if(myconf == "A") {
myInterfaceService = ref('myAService')
} else {
myInterfaceService = ref('myBService')
}
但我认为这是一个不好的做法,因为即使只有一个真的被使用,myAService
和myBService
也是如此。
我宁愿只有一个服务为Grails的服务和不同的不同的实现将位于src
目录,然后:
resources.groovy
与正确实施,填补了服务afterPropertiesSet
从InitializingBean
接口
不错。但是,只要说我有很多类,如DestinationBean,这是如何扩展的呢? – dublintech
一个选项是手动添加'def grailsApplication'并从ApplicationContext中检索bean,例如'def otherDest = grailsApplication.mainContext.getBean('')'。您可以定义bean名称并根据需要循环应用逻辑。 Spring有一个'InitializingBean'接口和一个'afterPropertiesSet'方法,一旦所有的代码都被设置好了,你就可以使用它了。你不能在这里使用它,因为你在Spring之后做了工作,但是你可以创建一个类似的接口(或者只是一个调用方法的约定)并在完成后调用它。 –