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[])
}
}
코드가 작동하려면 나타납니다 조금 뭘하는지 설명 할 것입니다,하지만 난이 일을 쉬운 방법이 있어야한다는 느낌을 도울 수 없어요. 마지막 줄은 특히 끔찍합니다. 내가 이것을 단순화 할 수있는 방법이 있습니까?
감사합니다, 돈
내가 많이 생성 될 겁니다를 컨트롤러 클래스 당 하나가 아닌 요청 당 하나의 FlashHelper 객체가 더 많습니다. 필자가 사용했던 접근 방식에서는 컨트롤러 인스턴스 당 하나가 아닌 컨트롤러 클래스/메타 클래스 당 FlashHelper를 사용합니다. 약간 더 읽기 쉬운 코드를 제외하고이 접근법에 대한 이점이 있습니까? 감사합니다. –
표준 Spring MVC 컨트롤러는 싱글 톤이지만 Grails에서는 요청마다 새로운 컨트롤러 인스턴스가 생성됩니다. 그래서 우리는 같은 수의 헬퍼 인스턴스를 생성합니다. 확인을 위해 println 또는 log 문을 getFlashHelper 클로저에 추가하십시오. –
하지만 내 접근 방식은 컨트롤러 당 하나의 FlashHelper ** 클래스 ** (컨트롤러 인스턴스 당 하나가 아닙니다)를 만들지 만 요청 당 하나씩 만듭니다. 여전히 metaHass 속성이 아닌 요청 속성으로 FlashHelper를 저장하면 어떤 이점이 있는지 알지 못합니다. –