我和Guice一起工作,有一个设计问题。我的应用程序由几个模块组成:
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
}
}
将DatabaseConnectionConfiguration传递给该单例的问题。myapp持久性模块并不真正关心如何获得该配置。现在它来自sys变量。
myapp rest是play应用程序,它希望从应用程序读取conf。conf并使用Guice将其注入其他组件。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-持久性模块仅用于测试目的。
class MyAppPersistenceDbConfModule extends AbstractModule {
override def configure(): Unit = {
bind(classOf[DbConfProvider]).to(classOf[DbConfSysEnvProvider])
}
}
从sys env读取DB连接设置。非生产用例。
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)中html" target="_blank">定义它。
默认为覆盖。保持数据库连接配置的默认绑定,就像您所做的那样,在那里实现最常见的配置策略。在下游模块中使用Guice Modules.override(...)API在需要时。
实现跨模块的统一配置机制,这不依赖于所使用的特定框架。(例如,Bootique,它是建立在Guice上的……但没有在游戏中使用它)。
我个人更喜欢第三种方法,但在没有像Bootique这样的东西的情况下,第二种方法是一个很好的替代方法。
我是GCP的新手,目前有一个使用GKE和gRPC的微服务架构。微服务正在向Google Cloud Pub/Sub发布事件。我的Web-UI正在使用Google Cloud Endpoint向微服务发送请求。我想在网站上有很多实时/推送更新(例如实时更新用户统计数据等),现在想知道如何最好地做到这一点。让Web-UI订阅Google Cloud Pub/Sub中的主题是不是一种不好的做法?GCP中
我用谷歌地球创建了一个kml文件,它使用外部图像创建了一个覆盖层。它工作得很好,我想找到一种相当方便的转换kml的方法,这样谷歌地图就可以以类似的方式读取和显示它。 谷歌地图不能处理谷歌地球坐标,所以我试图自己转换它们。例如,我替换了地球坐标: 使用等效地图坐标: 不幸的是,两者并不完全“对等”。“地图覆盖”稍微关闭,旋转不正确。 以下是两张照片: 地球实例 地图示例 我明白为什么它不起作用,但我
是否可以配置以了解我的用户名应该是什么? 默认情况下,它使用当前用户名,这在我的情况下是不正确的。 我在一台借贷者笔记本电脑上,我的用户名是,但我想告诉,我的用户名是。 加分:我在家的用户名是bgolemon。如果我可以配置每个主机的用户名,那就更好了。
我有一个使用Spring-Mongo集成的Spring应用程序。在主端配置XML中,我们有这样的东西来定义Mongo实例(有几个): 我想在Fongo的BDD套件配置中覆盖这一点,这样测试就不会使用真正的mongo。 我有点被“mongo:mongo”的具体设置搞得晕头转向。我以为你最终会得到一个com。mongodb。蒙哥,别这样。XML似乎指的是Spring MongoType? 我在BDD配
If set to true, variables read in from config files will overwrite each other. Otherwise, the variables will be pushed onto an array. This is helpful if you want to store arrays of data in config file