Dependency injection 谷歌用户界面,覆盖配置

Dependency injection 谷歌用户界面,覆盖配置,dependency-injection,playframework,guice,Dependency Injection,Playframework,Guice,我和Guice一起工作,有一个设计问题。我的应用程序由几个模块组成: myapp持久性(JPA实体、DAO、其他与数据库相关的东西) myapp后端(一些后台守护进程,它们使用myapp持久性) myapp rest(依赖于myapp持久性的rest应用程序) myapp持久性必须具有singleton HibernateSessionFactory。它是由Hibernate设计的。 没问题,我可以用Guice解决它: class MyAppPersistenceModule extends

我和Guice一起工作,有一个设计问题。我的应用程序由几个模块组成:

  • myapp持久性(JPA实体、DAO、其他与数据库相关的东西)
  • myapp后端(一些后台守护进程,它们使用myapp持久性)
  • myapp rest(依赖于myapp持久性的rest应用程序)
myapp持久性必须具有singleton HibernateSessionFactory。它是由Hibernate设计的。 没问题,我可以用Guice解决它:

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持久性模块并不真正关心如何获得该配置。现在它来自sys变量

myapp rest是play应用程序,它希望从application.conf读取conf并使用GUI将其注入其他组件。 myapp后端的功能大致相同

现在我把自己锁在

@Provides
  def provideDatabaseConnectionConfiguration: DatabaseConnectionConfiguration = {
    DatabaseConnectionConfiguration.fromSysEnv
  }
我不知道如何使myapp rest和myapp backend灵活且可配置

UPD 根据答案,我是这样做的:

定义特征

trait DbConfProvider {
  def dbConf: DbConf
}
Singleton工厂现在依赖于提供程序:

class HibernateSessionFactoryProvider @Inject()(dbConfProvider: DbConfProvider) extends Provider[SessionFactory] {
}
myapp持久化模块公开了带有所有piblic持久化模块DAO的公共GUI模块

myapp持久化模块仅用于测试目的。myapp持久性注入器加载模块描述如下:

class MyAppPersistenceDbConfModule extends AbstractModule {

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

}
DbConfSysEnvProvider从sys env读取数据库连接设置。非生产用例

Play应用程序有自己的配置机制。我已将自定义模块添加到应用程序配置:

# 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 {
...}

我不是游戏特定设置方面的专家,但通常通过以下方式之一解决此类设计问题:

  • 没有默认值。从上游模块(myapp persistence)中删除DatabaseConnectionConfiguration的绑定,并根据需要在每个下游模块(myapp backend,myapp rest)中定义它

  • 默认设置为覆盖。保持DatabaseConnectionConfiguration的默认绑定不变,实现最常见的配置策略。需要时,在下游模块中使用API覆盖它

  • 实现跨模块的统一配置机制,这不依赖于所使用的特定框架。(例如,它是建立在Guice上的……但还没有在Play中使用它)


  • 我个人更喜欢第三种方法,但如果没有像Bootique这样的东西,第二种方法是一个很好的替代方法。

    谢谢你的建议!