2017-10-04 51 views
0

在我的播放应用程序,我为此在Module.configure()可以在应用程序启动时阻止一个线程吗?

bind(classOf[GadgetsReader]).toInstance(GadgetsCsvReader) 
    bind(classOf[Gadgets]).asEagerSingleton() 

然后,我这样做:

@Singleton 
class Gadgets @Inject()(reader: GadgetsReader) { 
    val all:Seq[Gadget] = reader.readGadgets() 
} 

即同步加载一个大集合的小玩意从CSVfile到内存在启动时,在一个Play的渲染线程。

我没有看到Play实例中任何地方实现的类似场景。我想知道我在做什么是惯用的斯卡拉&玩。

是否可以像这样同步加载一个非常大的文件,因为我不想在数据完全加载之前提供任何请求服务?

这是一件好事,我创建了Gadgets类,然后注入它,而不是静态/对象方法Gadget.all

应该GadgetGadgets上课生活在model

任何其他意见,也将不胜感激。

回答

3

我想这取决于你想要启动的速度有多快,等等。一般来说,我会说是的,即使Akka的群集分片已经(或者至少,最后一次我读了)阻塞呼叫在返回之前等待初始化完成。在你的情况下,它可能是好的,但一个像这样的阻塞调用通常意味着做IO,并且IO可能失败(例如,如果你正在从网络文件系统读取,并且在启动时网络失败?)。所以有时候,最好设计一下你的应用程序,以便它能够在没有完成操作的情况下进行响应(可能还有一个不可用的状态),并且在异常情况下执行该操作,并重试等等,以防失败。但也许这对你的情况是过度的。为了回答你的其他问题 - 是的,依赖注入Gadgets肯定比使用静态单例更好,这意味着你可以控制Gadgets的创建方式(也许你可能想在测试中以不同的方式初始化它)。

model包中很可能很好,但这很大程度上取决于您的域以及它的外观。

+0

我已经在注射GadgetReader;是否需要注入Gadgets和GadgetReader? –

相关问题