2012-05-21 13 views
9

共通のインターフェイスを実装しているいくつかのサービスがあり、アプリケーションの起動時に他のサービスに注入するサービスの1つを選択できるようにしたいと考えています。Grailsアプリケーションでサービス実装を選択する方法は?

私は以下のようにresources.groovyからサービス実装を参照しようとしましたが、Springは選択したサービスの新しいインスタンスを作成し、その依存関係をautowireしません。

このソリューションを動作させるにはどうすればよいですか?それとも別の方法がありますか?

class MyService { 

    Repository repository 

    interface Repository { 
     void save(...) 
    } 
} 

class MySqlRepositoryService implements MyService.Repository { ... } 

class FileRepositoryService implements MyService.Repository { ... } 

resources.groovy:

beans = { 
    ... 
    repository(FileRepositoryService) { } 
} 

答えて

3

それは手作りの工場からのサービスへの参照を取得することももちろん可能ですが、私の意見では、あなたが撮影したアプローチは、最高のものです。アプリケーションの構成段階に関するすべての情報を1か所に集めるので、自分で使用するので、どの実装が使用されているかを追跡するのが簡単です。

あなたが直面したオートワイヤリングの落とし穴は、非常に簡単に説明できます。 grails-app/servicesに入れられたすべてのクラスは、自動的にGrailsによってSpringシングルトンBeanとして設定されます。したがって、grails-app/conf/resources.groovyに置かれたBean定義は別のBeanを作成しますが、Grailsの規約ではデフォルトは適用されません。

最も簡単な解決策は、豆の重複を避け、オートワイヤリングをオンにするために、次の構文を使用するsrc/groovyで実装を置くことです:

beans = { 
    repository(FileRepositoryService) { bean -> 
    bean.autowire = 'byName' 
    } 
} 
+0

だから、基本的に私のリポジトリは通常のSpring BeanはなくGrailsのサービスになります。それはうまくいくでしょう。ありがとう! –

関連する問題