grails 애플리케이션 설정을 서비스에 넣는다.


Answers

grailsApplication 을 서비스에 주입 할 수 있다고하더라도, 서비스가 구성을 다루지 않아야한다고 생각합니다. 단 하나의 책임 원칙 을 테스트하고 중단하기가 더 어렵 기 때문입니다. 상대방의 Spring은보다 강력한 방법으로 구성 및 인스턴스화를 처리 할 수 ​​있습니다. Grails는 문서에 전용 섹션 을 가지고 있습니다.

Spring을 사용하여 예제를 만들려면 resources.groovy 빈으로 서비스를 등록해야 resources.groovy

// Resources.groovy
import com.example.ExampleApiClient

beans {
    // Defines your bean, with constructor params
    exampleApiClient ExampleApiClient, 'baseUrl', 'username', 'password'
}

그러면 서비스에 의존성을 주입 할 수 있습니다.

class ExampleService {
    def exampleApiClient

    def relevantMethod(){
        exampleApiClient.action()
    }
}

또한 Config.groovy 파일에서 설정 구문에 대한 Grails 규칙을 사용하여 모든 bean 속성을 무시할 수 있습니다 : beans.<beanName>.<property> :

// Config.groovy
...
beans.exampleApiClient.baseUrl = 'http://example.org'

Config.groovyresources.groovy 는 서로 다른 환경 설정을 지원합니다.

Question

Java 라이브러리를 통해 써드 파티 REST API와 상호 작용할 grails 서비스를 만들고있다. Java 라이브러리는 url, username 및 password를 사용하여 REST API에 대한 신임장을 필요로합니다.

이 자격 증명을 configuration/Config.groovy 에 저장하고 서비스에 사용할 수 있도록하고 자격 증명을 요구하기 전에 서비스에 사용할 수 있도록하고 싶습니다.

grailsApplication.config 를 컨트롤러에서 사용할 수 있고 서비스의 메소드를 통해 관련 설정 값을 다음과 같이 서비스에 제공 할 수 있다는 점에 감사드립니다.

package example

class ExampleController {

    def exampleService

    def index = { }

    def process = {
        exampleService.setCredentials(grailsApplication.config.apiCredentials)
        exampleService.relevantMethod()
    }
}


package example

import com.example.ExampleApiClient;

class ExampleService {

    def credentials

    def setCredentials(credentials) {
        this.credentials = credentials
    }

    def relevantMethod() {

        def client = new ExampleApiClient(
            credentials.baseUrl,
            credentials.username,
            credentials.password
        )

        return client.action();
    }
}

나는 setCredentials() 호출하는 컨트롤러에 의존하기 때문에이 접근법에 약간의 결함이 있다고 생각한다. 서비스에 자동으로 자격 증명을 사용하게하면 더욱 강력 해집니다.

이 두 옵션 중 하나가 실행 가능합니다 (현재 Grails에 익숙하지 않습니다).

  1. 서비스 생성시 grailsApplication.config.apiCredentials 를 컨트롤러의 서비스에 삽입 하시겠습니까?

  2. 인스턴스화시 자격 증명을 서비스로 전달할 수 있도록 서비스에 컨스트럭터를 제공하십시오.

자격 증명을 서비스에 주입시키는 것이 이상적입니다. 어떻게이 일을 할 수 있겠습니까?




Links