Jon*_*ram 37 grails grails-controller
我正在创建一个grails服务,它将通过Java库与第三方REST API进行交互.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()
}
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我觉得这种方法有点缺陷,因为它取决于控制器调用setCredentials().将凭证自动提供给服务将更加健壮.
这两个选项中的任何一个都是可行的(我目前对grails不够熟悉):
grailsApplication.config.apiCredentials在创建服务时注入控制器中的服务?
在服务上提供某种形式的构造函数,允许在实例化时将凭据传递给服务吗?
将凭证注入服务是理想的.怎么可以这样做?
Jon*_*ram 79
该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();
}
}
Run Code Online (Sandbox Code Playgroud)
Cés*_*sar 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'
}
Run Code Online (Sandbox Code Playgroud)
然后,您将能够将依赖项注入您的服务
class ExampleService {
def exampleApiClient
def relevantMethod(){
exampleApiClient.action()
}
}
Run Code Online (Sandbox Code Playgroud)
此外,在您的Config.groovy文件中,您可以使用Grails约定优先于配置语法覆盖任何bean属性beans.<beanName>.<property>:
// Config.groovy
...
beans.exampleApiClient.baseUrl = 'http://example.org'
Run Code Online (Sandbox Code Playgroud)
双方Config.groovy并resources.groovy支持不同的环境配置.
| 归档时间: |
|
| 查看次数: |
25037 次 |
| 最近记录: |