特定于环境的Grails服务配置

特定于环境的Grails服务配置,grails,grails-services,Grails,Grails Services,使用特定于环境的值配置Grails服务的最佳方法是什么?我相信有两个选择: 从服务类内访问grailsApplication值或 在Config.groovy或resources.groovy中的bean闭包中配置服务bean 我在stackoverflow和其他地方看到了几篇文章,展示了如何执行#1(在服务中访问grailsApplication)。其中一个职位是: 然而,我认为这会造成服务与Grails之间不必要的耦合。这是否类似于在pojo中访问Spring的applicationCont

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

  • 从服务类内访问grailsApplication值或
  • 在Config.groovy或resources.groovy中的bean闭包中配置服务bean
  • 我在stackoverflow和其他地方看到了几篇文章,展示了如何执行#1(在服务中访问grailsApplication)。其中一个职位是:

    然而,我认为这会造成服务与Grails之间不必要的耦合。这是否类似于在pojo中访问Spring的applicationContext,而不是配置/注入值?而且,到目前为止,我还没有在服务类的单元测试中实现这一点

    两本书有注入属性的例子(方法2)。《Grails 2的权威指南》一书第10章题为“服务在行动”的章节介绍了如何做到这一点,但没有具体的环境价值。《Groovy和Grails菜谱》一书的第16-2节也展示了一个使用resources.Groovy的示例,但我还没能让它正常工作

    下面的博客文章也有一个很好的例子,但不是特定于环境的:。Grails参考的第15章也与这些示例一致,并展示了如何在每个环境的基础上设置bean的属性

    然而,任何一种方法的例子都没有给出任何意见或以某种方式这样做的合理性。这两种方法真的没有利弊吗?注入方法不是更容易进行单元测试并且更符合spring的工作方式吗


    内森

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


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

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


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

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

    到,Grails已经设置了事务:

    服务通常涉及域之间的协调逻辑 类,因此通常涉及跨大型 操作。鉴于服务的性质,他们经常需要 交易行为。您可以将编程事务用于 withTransaction方法,但是这是重复的,不会 充分利用Spring底层事务的强大功能 抽象

    默认情况下,您声明的Springbean不是事务性的

    “然而,我认为这会造成不必要的服务耦合 “圣杯”

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

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

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

    resources.groovy
    中定义的服务(服务文件夹中存在的类)和Springbean的概念上存在差异

    到,Grails已经设置了事务:

    服务通常涉及域之间的协调逻辑 类,因此通常涉及跨大型 操作。鉴于服务的性质,他们经常需要 交易行为。您可以将编程事务用于 withTransaction方法,但是这是重复的,不会 充分利用Spring底层事务的强大功能 抽象

    默认情况下,您声明的Springbean不是事务性的

    “然而,我认为这会造成不必要的服务耦合 “圣杯”

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

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

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

    谢谢,这是有道理的。最后,一些理性的做法!从您所说的来看,grails发明家的思维似乎发生了转变,因为您描述的问题类型是复制spring配置中应该相同的值。因此,引用基本上集中在grailsApplication下的配置值是一个实际的改进。也许在groovy中安装比在Java中更容易,或者在Spring中也可以选择它。@NathanWard覆盖配置方法是inva