2013-07-15 5 views
1

환경 특정 값으로 Grails 서비스를 구성하는 가장 좋은 방법은 무엇입니까? 서비스 클래스 내에서환경 특정 Grails 서비스 구성

  1. 액세스의 GrailsApplication 값이나 Config.groovy 파일이나 resources.groovy에 콩 폐쇄에
  2. 구성 서비스 콩 : 나는 두 가지 옵션이있다 생각합니다.

나는 stackoverflow와 다른 곳에서 # 1 (서비스에서 grailsApplication에 액세스)하는 방법을 보여주는 게시물을 보았다. 그러한 게시물 중 하나는 Inject grails application configuration into service입니다.

그러나 이것이 서비스의 불필요한 결합을 Grails에 연결한다고 생각합니다. 값을 설정/삽입하는 대신 pojo에서 Spring의 applicationContext에 액세스하는 것과 비슷하지 않습니까? 또한, 나는 아직 서비스 클래스의 단위 테스트에서 작동하도록하는 행운이 없었어요.

두 권의 책에는 속성을 주입하는 예제가 있습니다 (접근법 # 2). Grails 2에 대한 확실한 안내서, 10 장, "서비스 구현 방법"절에서는 환경을 특정 값으로하지 않고이를 수행하는 방법을 보여줍니다. 그루비와 Grails Recipes, 섹션 16-2에서는 resources.groovy를 사용하는 예제도 보여 주지만 아직 작동하지는 못했습니다.

다음 블로그 게시물도 좋은 예가 있지만 환경에 따라 달라지지는 않습니다 : http://ldaley.com/post/1253952347/getting-more-out-of-property-override-configuration. Grails Reference의 15 장은 이러한 예제들과 일관성이 있으며 환경 별 기준으로 bean에 속성을 설정하는 방법을 보여줍니다.

그러나 어느 방법이든 어떤 방법 으로든 어떤 방법 으로든 의견을 제시하거나 합리적으로 생각할 수는 없습니다. 두 가지 접근법에 찬반 양론이 실제로 존재하지 않습니까? 사출 접근법이 단위 테스트보다 쉬우 며 일을 수행하는 봄 방법과 더 일관성이 있지 않을까요?

나단

답변

1

난 당신이 더 편안있어 중 사용을 말할 것입니다. 나는 서비스에서 직접 grailsApplication.config에 액세스하는 경향이있다. 왜냐하면 서비스에서 직접 구성 옵션을 만들 수있게하기 때문에 (더 나은 단어를 원할 경우) 구성 옵션에 이름을 붙일 수 있다는 의미에서 구성 메소드를 명명 할 수 있기 때문이다. 그들은 통제한다. 두 개 (또는 그 이상)의 다른 빈이 사이트 관리자의 이메일 주소를 알아야한다면 (예를 들어) beans.monitorService.destinationEmailbeans.userService.fromEmail을 별도로 구성해야하는 것이 아니라 grailsApplication.config.myapp.admin.email을 읽을 수 있습니다.

단위 테스트에서는 grailsApplication 구성을 조롱해야합니다. 따라서 서비스에서 읽어야하는 구성 옵션에 대한 테스트 값을 채우는 것은 그리 중요하지 않습니다.

+0

덕분에, 그 사실은 의미가 있습니다. 마지막으로, 접근을위한 합리적인 일부! –

+0

당신이 말했던 바에 따르면, grails 발명가는 스프링 구성에서 동일한 값이어야하는 값을 복제하는 것으로 설명한 문제의 유형 때문에 사고 방식이 바뀐 것으로 보입니다. 기본적으로 grailsApplication 하에서 중앙 집중화 된 설정 값에 대한 참조는 실질적인 개선점입니다. 아마도 groovy로 Java에서 설정하는 것보다 쉬울 수도 있었을 것입니다. 아마도 Spring에서도 옵션 일 것입니다. –

+0

@NathanWard 재정의 구성 접근법은 특정 상황에서 주로 제어 할 수없는 bean (예 : 플러그인에서 제공하는 bean)에 속성 값을 삽입하려는 경우 매우 중요합니다. –

0

서비스의 개념 (서비스 폴더에있는 클래스)과 스프링 빈의 정의가 resources.groovy에 정의되어 있습니다. services으로

, 이미 Grails의 설정 거래 :

서비스는 일반적으로 도메인 사이에 클래스 논리를 조정되고 종종 많은 오퍼레이션이 영속성을 사용한다. 서비스의 성격을 감안할 때 이들은 종종 트랜잭션 동작을 필요로합니다. withTransaction 메서드를 사용하여 프로그래밍 방식 트랜잭션을 사용할 수 있지만 반복적이며 은 Spring의 기본 트랜잭션 추상화를 최대한 활용하지 않습니다.

선언 한 스프링 빈은 기본적으로 트랜잭션이 아닙니다.

는 Grails의 서비스는 봄 콩과 다를

때문에 내가 1 문제 사용 방법 번호가 표시되지 않습니다 "그러나, 나는이 Grails를 할 수있는 서비스 의 불필요한 커플 링을 만들어 생각한다".

단위 테스트의 경우 서비스 인스턴스를 수동으로 연결해야합니다. 예 :

class MyService { 
    def grailsApplication 
} 

class MyServiceTests { 
    MyService getServiceInstance() { 
    MyService myService = new MyService() 
    myService.grailsApplication = grailsApplication //static attribute in unit tests 
    return myService 
    } 
} 
+0

답장을 보내 주셔서 감사합니다. 필자는 여전히 Grails 서비스 개념이 Martin Fowler의 Enterprise Architecture Patterns에서 같은 이름의 패턴을 기반으로하는 서비스 계층 개념과 동일하다고 생각합니다. –

+0

개념은 동일 할 수 있지만 Grails Service와 Grails Spring Bean은 동일하지 않습니다. –