39

Java ライブラリを介してサードパーティの REST API と対話する grails サービスを作成しています。Java ライブラリには、URL、ユーザー名、およびパスワードによる 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()ます。資格情報をサービスで自動的に利用できるようにすると、より堅牢になります。

これら2つのオプションのいずれかが実行可能ですか(私は現在、grailsに十分に精通していません):

  1. grailsApplication.config.apiCredentialsサービスの作成時にコントローラーでサービスに注入しますか?

  2. インスタンス化時に資格情報をサービスに渡すことを可能にする、何らかの形式のコンストラクターをサービスに提供しますか?

クレデンシャルをサービスに注入するのが理想的です。これはどのように行うことができますか?

4

4 に答える 4

81

grailsApplicationオブジェクトはサービス内で利用可能で、次のことが可能です:

package example

import com.example.ExampleApiClient;

class ExampleService {

    def grailsApplication

    def relevantMethod() {

        def client = new ExampleApiClient(
            grailsApplication.config.apiCredentials.baseUrl
            grailsApplication.config.apiCredentials.username,
            grailsApplication.config.apiCredentials.password
        )

        return client.action();
    }
}
于 2011-02-11T21:11:50.897 に答える
11

サービスに注入することはできますがgrailsApplication、テストが難しく、単一責任の原則に違反するため、サービスは構成を処理する必要はないと思います。一方、Spring は、より堅牢な方法で構成とインスタンス化を処理できます。Grailsのドキュメントには専用のセクションがあります。

Spring を使用して例を機能させるには、サービスを Bean として登録する必要があります。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、異なる環境構成がサポートされます。

于 2014-09-23T15:55:36.283 に答える