9

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

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

このソリューションを機能させるにはどうすればよいですか?または別の方法はありますか?

class MyService {

    Repository repository

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

class MySqlRepositoryService implements MyService.Repository { ... }

class FileRepositoryService implements MyService.Repository { ... }

resources.groovy:

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

1 に答える 1

3

もちろん、手作りの工場からサービスへの参照を取得することは可能ですが、私の意見では、あなたが取ったアプローチが最良のものです。アプリケーションの構成フェーズに関するすべての情報を1か所に収集するため、自分で使用します。これにより、使用されている実装を追跡しやすくなります。

あなたが遭遇した自動配線の落とし穴は非常に簡単に説明できます。入力されたすべてのクラスは、grails-app/services名前による自動配線を備えたSpringシングルトンBeanとしてGrailsによって自動的に構成されます。したがって、配置したBean定義grails-app/conf/resources.groovyは別のBeanを作成しますが、Grailsの規則によって課されるデフォルトはありません。

最も簡単な解決策はsrc/groovy、Beanの重複を回避するために実装を配置し、次の構文を使用して自動配線をオンにすることです。

beans = {
  repository(FileRepositoryService) { bean ->
    bean.autowire = 'byName'
  }
}
于 2012-05-21T08:19:45.363 に答える