2013-07-15 47 views
1

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

  1. 从服务类中访问grailsApplication值或
  2. 配置Config.groovy中或resources.groovy一豆关闭该服务的bean。

我见过几个帖子在stackoverflow和其他地方,显示如何做#1(访问服务中的grailsApplication)。其中一个这样的帖子是:Inject grails application configuration into service

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

两本书都有注入属性的例子(方法#2)。本书Grails 2权威指南第10章标题为“服务在行动”一节展示了如何做到这一点,但没有环境特定的价值。本书Groovy和Grails食谱第16-2节也展示了一个使用resources.groovy的例子,但我还没有能够使它工作。

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

但是,任何一种方法的例子都不能以任何方式给出任何意见或理由。这两种方法真的没有优点和缺点吗?注入方法不会更容易进行单元测试,并且更符合春季做事的方式吗?

Nathan

回答

1

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

在单元测试中,您不得不模拟grailsApplication配置,因此填写您的服务需要读取的配置选项的测试值没什么大不了的。

+0

谢谢,这实际上是有道理的。最后,一些理性的方法! –

+0

从你所说的话来看,Grails发明人似乎已经在思考上发生了转变,因为你所描述的问题类型与重复的值在春季配置中应该是相同的值。因此,对基本上集中在grailsApplication下的配置值的引用是一个实际的改进。也许用groovy来设置比在Java中更容易,否则它也可能在Spring中成为一个选项。 –

+0

@NathanWard覆盖配置方法在某些情况下是非常有用的,主要是当你想要将属性值注入到你不控制的bean(例如由插件提供的属性值)时。 –

0

resources.groovy中定义的服务(存在于服务文件夹中的类)和Spring Beans中的概念有所不同。

services,Grails的已安装的交易:

服务通常涉及协调 类域间的逻辑,并因此常常涉及范围的持久化大 操作。鉴于服务的性质,他们经常需要事务性行为 。您可以使用withTransaction方法使用 的程序化交易,但是这是重复性的,并且不会 充分利用Spring底层交易 抽象的力量。

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

“不过,我认为这会在服务 的不必要的耦合中的Grails”

由于Grails服务从春天豆类不同,我没有看到一个#使用问题的方法1。

对于单元测试,您需要手动连线服务实例。例如:

class MyService { 
    def grailsApplication 
} 

class MyServiceTests { 
    MyService getServiceInstance() { 
    MyService myService = new MyService() 
    myService.grailsApplication = grailsApplication //static attribute in unit tests 
    return myService 
    } 
} 
+0

感谢您的回复。我仍然认为Grails服务概念与Martin Fowler在企业架构模式中基于相同名称模式的服务层概念相同。 –

+0

这个概念可以相同,但Grails服务和Grails Spring Bean并不相同。 –