Dependency injection 谷歌用户界面,覆盖配置
我和Guice一起工作,有一个设计问题。我的应用程序由几个模块组成: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
- myapp持久性(JPA实体、DAO、其他与数据库相关的东西)
- myapp后端(一些后台守护进程,它们使用myapp持久性)
- myapp rest(依赖于myapp持久性的rest应用程序)
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 {
...}
我不是游戏特定设置方面的专家,但通常通过以下方式之一解决此类设计问题:
我个人更喜欢第三种方法,但如果没有像Bootique这样的东西,第二种方法是一个很好的替代方法。谢谢你的建议!