2017-04-30 6 views
1

私はGuiceと仕事をしており、デザインに関する質問が1つあります。私のアプリはいくつかのモジュールから構成されていますGoogle guice、オーバーライド設定

  • myappの永続性(JPAエンティティ、DAO、他のDB関連のもの)
  • myappの-バックエンド(いくつかのバックグラウンドデーモン、彼らはmyappの永続性を使用)
  • myappの休止(myapp-persistenceに依存するRESTアプリケーション)

myapp-persistenceには、シングルトンのHibernateSessionFactoryが必要です。これはHibernateの設計によるものです。私はGuiceのとそれを解決することができ 問題ありません:そのシングルトンにDatabaseConnectionConfigurationを渡すと

class MyAppPersistenceModule extends AbstractModule { 

    override def configure(): Unit = { 

    bind(classOf[SomeStuff]) 
    bind(classOf[ClientDao]) 
    bind(classOf[CustomerDao]) 
    bind(classOf[SessionFactory]).toProvider(classOf[HibernateSessionFactoryProvider]).asEagerSingleton() 

    } 

    @Provides 
    def provideDatabaseConnectionConfiguration: DatabaseConnectionConfiguration = { 
    DatabaseConnectionConfiguration.fromSysEnv 
    } 

} 

問題。 myapp-persistenceモジュールは実際にその設定を取得する方法を気にしません。今はsys変数から取り込まれています。

myapp-restはplay-appであり、application.confからconfを読み取り、Guiceを使用して他のコンポーネントに注入したいとします。 myapp-backendは多かれ少なかれ同じことをします。

は、今私は

@Provides 
    def provideDatabaseConnectionConfiguration: DatabaseConnectionConfiguration = { 
    DatabaseConnectionConfiguration.fromSysEnv 
    } 

で自分自身をロックしていると私はmyappの-休息とmyappに、バックエンドのために、それは柔軟で設定可能にする方法を理解していません。

UPD は答えによると、私はそれをこのようでした:

定義された形質

trait DbConfProvider { 
    def dbConf: DbConf 
} 

シングルトンの工場は現在、プロバイダによって異なります。

class HibernateSessionFactoryProvider @Inject()(dbConfProvider: DbConfProvider) extends Provider[SessionFactory] { 
} 

myappの永続性モジュールが公開すべてのピブリックパーシスタンスモジュールDAOを備えたpublic guiceモジュール。

myapp-persistenceには、テスト目的でのみ使用されるモジュールがあります。以下に記載のMyApp-永続インジェクタロードモジュール:

class MyAppPersistenceDbConfModule extends AbstractModule { 

    override def configure(): Unit = { 
    bind(classOf[DbConfProvider]).to(classOf[DbConfSysEnvProvider]) 
    } 

} 

DbConfSysEnvProviderは、SYS ENVからDB接続設定を読み出します。実稼働ではないケース。

Playアプリは独自のconfメカニズムを持っています。

# play-specific config 
play.modules.enabled += "common.components.MyAppPersistenceDbConfModule" 
# public components from myapp-persistence module. 
play.modules.enabled += "com.myapp.persistence.connection.PersistenceModule" 

そして、私の設定サービス:

@Singleton 
class ConfigurationService @Inject()(configuration: Configuration) extends DbConfProvider { 
...} 

答えて

2

私がプレイ固有のセットアップの専門家ではないですが、一般的に設計上のこの種の問題は解決され、私は、アプリのconfに私のカスタムモジュールを追加しました

  1. デフォルトではありません。上流モジュール(myapp-persistence)からDatabaseConnectionConfigurationのバインディングを削除し、各下流モジュール(myapp-backend、myapp-rest)で適切に定義します。

  2. デフォルトで上書きされます。 DatabaseConnectionConfigurationのデフォルトのバインドをそのまま維持し、そこで最も一般的な構成戦略を実装します。必要に応じてGuice Modules.override(..) APIを使用して下流のモジュールでオーバーライドします。

  3. モジュール間で、使用される特定のフレームワークに依存しない統一された構成メカニズムを実装します。 (Guiceに組み込まれた例:Bootique ... Playでは使用していません)。

私は個人的にアプローチ#3を好みますが、Bootiqueのようなものがない場合は#2が良い代替品です。

+0

アイデアありがとう! – Sergey

関連する問題