1

環境固有の値を使用して Grails サービスを構成する最良の方法は何ですか? 次の 2 つのオプションがあると思います。

  1. サービスクラス内から grailsApplication の値にアクセスする、または
  2. Config.groovy または resources.groovy の bean クロージャーでサービス Bean を構成します。

#1 (サービスで grailsApplication にアクセスする) の方法を示すスタックオーバーフローやその他の場所での投稿をいくつか見ました。そのような投稿の 1 つに、Grails アプリケーション構成をサービスに注入する があります。

ただし、これにより、サービスと Grails との不必要な結合が生じると思います。これは、値を構成/注入するのではなく、pojo で Spring の applicationContext にアクセスすることに似ていませんか? また、これをサービスクラスの単体テストで機能させるにはまだ運がありません。

2 冊の本に、プロパティを注入する例があります (アプローチ #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 Reference の第 15 章もこれらの例と一致しており、環境ごとに Bean のプロパティを設定する方法を示しています。

ただし、どちらのアプローチの例も、何らかの方法でそれを行うための意見や合理性を示していません。どちらのアプローチにも長所と短所は本当にありませんか? インジェクション アプローチは単体テストが容易であり、春のやり方とより一貫性があるのではないでしょうか?

ネイサン

4

2 に答える 2

0

サービス(サービスフォルダに存在するクラス)と で定義されているSpring Beansの概念に違いがあります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 に答える