1

使用环境特定值配置 Grails 服务的最佳方式是什么?我相信有两种选择:

  1. 从服务类中访问 grailsApplication 值或
  2. 在 Config.groovy 或 resources.groovy 的 beans 闭包中配置服务 bean。

我在 stackoverflow 和其他地方看到了几篇文章,这些文章展示了如何做 #1(在服务中访问 grailsApplication)。其中一篇文章是:将 grails 应用程序配置注入服务

但是,我认为这会造成服务与 Grails 的不必要耦合。这不是类似于在 pojo 中访问 Spring 的 applicationContext 而不是配置/注入值吗?此外,到目前为止,我还没有任何运气让它在服务类的单元测试中工作。

两本书都有注入属性的示例(方法#2)。The Definitive Guide to Grails 2,第 10 章,标题为“Services in Action”的一本书展示了如何做到这一点,但没有特定于环境的值。Groovy and Grails Recipes 一书,第 16-2 节也展示了一个使用 resources.groovy 的示例,但我还不能让它工作。

以下博客文章也有一个很好的示例,但不是特定于环境的:http: //ldaley.com/post/1253952347/getting-more-out-of-property-override-configuration。Grails 参考的第 15 章也与这些示例一致,并展示了如何在每个环境的基础上设置 bean 的属性。

然而,这两种方法的例子都没有给出任何意见或合理的做法。这两种方法真的没有优点和缺点吗?注入方式不是更容易单元测试,更符合spring的做事方式吗?

弥敦道

4

2 回答 2

1

我会说使用你更舒服的那个。我倾向于grailsApplication.config直接从服务访问,因为这样可以使配置更加“语义化”(因为需要更好的词),因为您可以根据它们所做的事情来命名配置选项,而不是它们的 bean控制。如果两个(或更多)不同的 bean 需要知道站点管理员的电子邮件地址(例如),那么它们都可以读取,而grailsApplication.config.myapp.admin.email不必我必须单独配置。beans.monitorService.destinationEmailbeans.userService.fromEmail

在单元测试中,无论如何您都必须模拟grailsApplication配置,因此为您的服务需要读取的配置选项填充测试值没什么大不了的。

于 2013-07-15T17:00:40.330 回答
0

服务(服务文件夹中存在的类)的概念和resources.groovy.

对于services,Grails 已经设置了事务:

服务通常涉及域类之间的协调逻辑,因此通常涉及跨越大型操作的持久性。鉴于服务的性质,它们经常需要交易行为。您可以通过 withTransaction 方法使用编程事务,但是这是重复的,并且没有充分利用 Spring 底层事务抽象的力量。

默认情况下,您声明的 Spring Bean 不是事务性的。

“但是,我认为这会造成服务与 Grails 的不必要耦合”

由于 Grails 服务与 Spring Beans 不同,我认为使用方法 #1 没有问题。

对于单元测试,您需要手动连接您的服务实例。例子:

class MyService {
  def grailsApplication
}

class MyServiceTests {
  MyService getServiceInstance() {
    MyService myService = new MyService()
    myService.grailsApplication = grailsApplication //static attribute in unit tests
    return myService
  }
}
于 2013-07-15T17:01:54.607 回答