Внедрение конфигурации приложения Grails в эксплуатацию
Я создаю службу grails, которая будет взаимодействовать с сторонним REST API через библиотеку Java. Библиотека Java требует учетных данных для REST API с помощью URL-адреса, имени пользователя и пароля.
Я хотел бы сохранить эти учетные данные в 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):
-
Вставить grailsApplication.config.apiCredentials
в службу в контроллере при создании службы?
-
Предоставить какую-либо форму конструктора в службе, которая позволяет передавать учетные данные службе в момент создания экземпляра?
Наличие учетных данных, введенных в службу, является идеальным. Как это можно сделать?
Ответы
Ответ 1
Объект 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();
}
}
Ответ 2
Даже если 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
вы можете переопределить любое свойство bean, используя синтаксис соглашения Grails по конфигурации: beans.<beanName>.<property>
:
// Config.groovy
...
beans.exampleApiClient.baseUrl = 'http://example.org'
Оба Config.groovy
и resources.groovy
поддерживают различную конфигурацию среды.
Ответ 3
В контекстах, где вы не можете вводить grailsApplication bean (сервис не является одним из тех, который описан Джоном Крамом), например, вспомогательный класс, расположенный в src/groovy, вы можете получить к нему доступ, используя Держатели класс:
def MyController {
def myAction() {
render grailsApplication == grails.util.Holders.grailsApplication
}
}