2010-01-28 2 views
0

각 컨트롤러에 getFlashHelper 메소드를 추가하는 플러그인을 개발 중입니다. 이 메서드는 FlashHelper 클래스의 인스턴스를 반환해야합니다.Grails : 플러그인 내에서 동적 메소드 추가하기

그러나, FlashHelper 클래스의 생성자는 getFlashHelper 메서드가 호출 된 된 컨트롤러의 예를을 통과해야합니다.

희망 다음 코드는 내가 더 나은

def doWithDynamicMethods = {ctx -> 

    application.controllerClasses*.metaClass*.getFlashHelper = { 

     def controllerInstance = delegate 

     // Avoid creating a new FlashHelper each time the 'flashHelper' property is accessed 
     if (!controllerInstance.metaClass.hasProperty('flashHelperInstance')) { 
      controllerInstance.metaClass.flashHelperInstance = new FlashHelper(controller: controllerInstance) 
     } 

     // Return the FlashHelper instance. There may be a simpler way, but I tried 
     // controllerInstance.metaClass.getMetaProperty('flashHelperInstance') 
     // and it didn't work 
     return controllerInstance.metaClass.getMetaProperty('flashHelperInstance').getter.invoke(controllerInstance, [] as Object[]) 
    } 
} 

코드가 작동하려면 나타납니다 조금 뭘하는지 설명 할 것입니다,하지만 난이 일을 쉬운 방법이 있어야한다는 느낌을 도울 수 없어요. 마지막 줄은 특히 끔찍합니다. 내가 이것을 단순화 할 수있는 방법이 있습니까?

감사합니다, 돈

답변

1

컨트롤러를 당 요청을 생성하기 때문에, 내가 요청 속성과 도우미 저장하는 것 : 나는이 방법을 사용하는 경우

for (c in grailsApplication.controllerClasses) { 
    c.clazz.metaClass.getFlashHelper = { -> 
     def controllerInstance = delegate 
     def request = controllerInstance.request 
     def helper = request['__flash_helper__'] 
     if (!helper) { 
     helper = new FlashHelper(controller: controllerInstance) 
     request['__flash_helper__'] = helper 
     } 
     helper 
    } 
} 
+0

내가 많이 생성 될 겁니다를 컨트롤러 클래스 당 하나가 아닌 요청 당 하나의 FlashHelper 객체가 더 많습니다. 필자가 사용했던 접근 방식에서는 컨트롤러 인스턴스 당 하나가 아닌 컨트롤러 클래스/메타 클래스 당 FlashHelper를 사용합니다. 약간 더 읽기 쉬운 코드를 제외하고이 접근법에 대한 이점이 있습니까? 감사합니다. –

+0

표준 Spring MVC 컨트롤러는 싱글 톤이지만 Grails에서는 요청마다 새로운 컨트롤러 인스턴스가 생성됩니다. 그래서 우리는 같은 수의 헬퍼 인스턴스를 생성합니다. 확인을 위해 println 또는 log 문을 getFlashHelper 클로저에 추가하십시오. –

+0

하지만 내 접근 방식은 컨트롤러 당 하나의 FlashHelper ** 클래스 ** (컨트롤러 인스턴스 당 하나가 아닙니다)를 만들지 만 요청 당 하나씩 만듭니다. 여전히 metaHass 속성이 아닌 요청 속성으로 FlashHelper를 저장하면 어떤 이점이 있는지 알지 못합니다. –