在我的Play应用中,我在Module.configure()
中执行此操作:
bind(classOf[GadgetsReader]).toInstance(GadgetsCsvReader)
bind(classOf[Gadgets]).asEagerSingleton()
然后,我这样做:
@Singleton
class Gadgets @Inject()(reader: GadgetsReader) {
val all:Seq[Gadget] = reader.readGadgets()
}
在Play的渲染线程中,它会在启动时将CSV文件中的大量小工具同步加载到内存中。
我没有在Play示例中的任何地方看到类似的场景。我想知道我在做什么是惯用的Scala& amp;播放。
是否可以像这样同步加载一个非常大的文件,因为我不想在数据完全加载之前提供任何请求?
我创建一个Gadgets
类然后注入它而不是静态/对象方法Gadget.all
这是一件好事吗?
Gadget
和Gadgets
类应该位于model
吗?
任何其他评论也将受到赞赏。
答案 0 :(得分:3)
我想这取决于你想要你的创业有多大,多快等等。一般来说,我会说是的,即使Akka的集群分片已经(或者至少,最后我读过,有)阻塞调用在返回之前等待初始化完成。在你的情况下,它可能很好,但是一个阻塞调用这样的阻塞通常意味着执行IO,IO可能会失败(例如,如果你从网络文件系统读取,并且当你启动时网络出现故障) ?)。所以有时,最好设计你的应用程序,使其能够响应(可能具有不可用的状态)而不进行操作,并且异步执行该操作,并在失败的情况下重试等。但也许这对你的情况来说太过分了。
回答你的其他问题 - 是的,依赖注入Gadgets
肯定比使用静态单例更好,这意味着你可以控制Gadgets
的创建方式(也许你可能想要初始化它)在测试中有所不同。)
在model
包中可能会很好,但这在很大程度上取决于您的域名及其外观。