Grails的服务中使用的方法从其他服务(Grails service using a method

2019-07-31 07:23发布

我建立一个Grails应用程序和所遇到的问题试图instatiate服务时,在不同的服务。 无论是服务的使用在其他如中定义的方法。

class fooService{
    def barService
    barService.doIt()

    def getIt(){
    ...
    }
}

class barService{
    def fooService
    fooService.getIt()

    def doIt(){
    ...
    }
}

当我运行应用程序,并转到被使用的方法,它带来了这个错误;

Error creating bean with name 'fooService': 
org.springframework.beans.factory.FactoryBeanNotInitializedException: FactoryBean is 
not fully initialized yet

这是一件无法用Grails做呢? 或者,任何人都可以提供任何意见?

谢谢

Answer 1:

我已经在过去也有类似的问题,但只有当这两种服务是事务性的。 如果有可能,使他们中的至少一种非事务那么它应该工作原样。 如果这是不可能的,那么回退是做一种“后期绑定”

class FooService {
  def grailsApplication
  private getBarService() {
    grailsApplication.mainContext.barService
  }

  public methodThatUsesBarService() {
    barService.doSomething()
  }
}

这将查找barService在应用方面,在需要用到它,而不是在该点的点FooService被创建。



Answer 2:

服务可以通过其他服务来调用,但在初始化时不可能的。 如果要实现这一点,方式应该是这样。

class fooService{
    def barService

    def getIt(){
        ...
    }

    def anotherFooMethod(){

        barService.doIt();
    }
}

class barService{
    def fooService


    def doIt(){
        ...
    }

    def anotherBarMethod(){

        fooService.getIt();
    }
}


Answer 3:

所有这些问题的答案是优秀的,并展示如何通过框架处理问题。 虽然,当我有这个问题,我意识到必须有我的计划和架构的缺陷,如果我绝对必须有服务呼叫对方,引起冲突。 相反,找到的工作,围绕我参加了一个稍微不那么复杂和两岸向前的做法 - 我重组。 我把从服务类违规的方法到另一个服务类。 它采取了一些重构,重新思考和复制/粘贴技巧,但我认为应用是它更好。

我并不是说这是比其他答案更好。 我说,这个时候,这个项目的重构是一个更好,更快,更复杂的解决方案。 我强烈推荐它。

更新我们最后的策略是重构所有的“效用”服务功能集成到一个baseService类,然后有需要的公用服务扩展baseService所有其他服务。 这项新政策是为了避免注射服务到其他服务,除非一些情况出现,不允许我们遵循这一遗传模式。 这将为我们提供一个更干净的代码基础,减少注射遵循的意大利面条踪迹。 另外,它消除了这种错误的出现。



Answer 4:

这不是有效的代码,所以很难知道到底发生了什么上。 是doIt()getIt()在构造函数的调用? 如果是这样,改变服务来实现org.springframework.beans.factory.InitializingBean做在调用afterPropertiesSet方法。



Answer 5:

您可以使用以下处理循环引用 -

让我们把它叫做firstSerivce和secondService。

对于secondService类代码更改

protected def firstService 
def grailsApplication 

def initialize() {
    this.firstService = grailsApplication.mainContext.firstService 
}

BootStrap.groovy中的代码更改

def secondService

def init = { servletContext ->

    secondService.initialize()
...
..


文章来源: Grails service using a method from another service