2013-07-03 4 views
1

도메인 클래스가 많은 플러그인이 있습니다. 이 플러그인은 여러 응용 프로그램에서 사용됩니다.도메인 클래스 외부의 도메인 클래스 캐시 설정 변경

내 문제는 도메인 클래스 자체에서 매핑 -> 캐시 설정을 지정할 수 없다는 것입니다 (도메인을 사용하는 응용 프로그램에 따라 다른 값이 필요하기 때문에). 예를 들어, 응용 프로그램 A에서 도메인 클래스 X를 캐시 전용으로 읽기 전용으로 만들고 도메인 클래스 Y를 캐시하지 않도록하고 싶습니다. 응용 프로그램 B에서는 도메인 클래스 X 트랜잭션을 캐시하고 도메인 클래스 Y를 읽기 전용으로 캐시하도록하고 싶습니다. 내가 좋아하는 것 무엇

뭔가처럼 (I이 가능 이미 바라고 있어요) :

를 :

grails.gorm.default.mapping { cache true } 

하지만 그 대신 세계가되는, 난 그냥 특정 도메인 클래스, 같은에 적용 할 수 있습니다

grails.gorm.com.integralblue.domain.User.mapping { cache true } 

누군가가 Grails의의 설정을 확인 각 도메인 클래스를 가진 제안했다, 뭔가 같은 :

static mapping = { 
    cache: Holders.grailsApplication.config.com.package.Person.cache ?: false 
} 

그리고 구성 :

com.package.Person.cache = true 

하지만 난 그

가능한 경우 감사를 피하기 위해 싶습니다!

+0

왜 그런 접근을 피하고 싶습니까? – dmahapatro

+0

이 플러그 인에서 도메인 클래스를 변경하고 다른 프로젝트에 다시 릴리스하는 것은 당황스럽고 다른 클래스의 다른 프로젝트에서도 동일한 캐싱 수정을 수행해야한다는 것을 의미합니다. 그러면 큰 번거 로움이 있습니다. 그래서 피할 수 있다면 좋을 것입니다. 기술적 인 이유 일 필요는 없으며, 관료적 인 이유가 더 많습니다. –

답변

0

당신이 언급 한 접근법은 이상적인 경우 시나리오에서 사용해야합니다. 플러그인과 애플리케이션에서 변경해야한다는 데 동의합니다.

이상적으로, 플러그인의 도메인 클래스는 오버 라이드 할 수있는 관대 한 매핑을 제공해야합니다.

플러그인에 grails.gorm.default.mapping { cache true }을 사용하거나 도메인 클래스에 매핑 한 적이 있거나 cache: true 인 경우 필요에 따라 응용 프로그램에서 쉽게 대체 할 수 있습니다. 예를 들면 :

//Domain class in Plugin 
class Person{ 
    static mapping = { 
     cache: 'read-only' 
    } 
} 

매핑이 원하는 경우

//Application A: 
Person.metaClass.'static'.mapping = { 
    cache 'transactional' 
} 

//Application B: 
Person.metaClass.'static'.mapping = { 
    cache 'read-write' 
} 

(테스트되지 않은)
같은 런타임 관련 응용 프로그램에서 metaClassed에 의해 쉽게 할 수있는 그루비 객체의 정적 블록하지만 아무것도 없기 때문에 모든 도메인 클래스에 대해 동일한 작업을 수행하려면 다음과 같이 도메인 클래스 인공물을 사용할 수 있습니다.

//Application A BootStrap 
grailsApplication.domainClasses.each{ 
    it.clazz.metaClass.'static'.mapping = {cache 'transactional'} 
} 
선택적으로

:

//Application A BootStrap 
def personClazz = 
    grailsApplication.domainClasses.find{it.clazz.simpleName == 'Person'}.clazz 
personClazz .metaClass.'static'.mapping = {cache 'transactional'} 

* 당신이 플러그인을 사용하여 응용 프로그램에 약간의 수정을해야하는 경우 중 하나.

+0

기존 매핑 블록보다 우선 적용됩니까? 아니면 추가됩니까? –

+0

이렇게하면 모든 맵핑 @AlexBeardsley를 지정해야합니다. – dmahapatro

+0

또한 grails가 매핑을보고 그걸로 작업하기 전에 부트 스트랩이 실행됩니까? 나는 사물이 어떻게 실행되는지 순서에 익숙하지 않습니다. –