在Scala中编写数据库库 - 初始化代码

时间:2014-05-30 07:21:20

标签: scala library-design

我想用Scala语言为Neo4j数据库编写小型库。该库将与Neo4j数据库进行通信,并且主要将类映射到节点。我想让它像spray-json库一样工作:https://github.com/spray/spray-json

无论如何,我想知道一件事,在库中实现初始化代码的最佳方法是什么?

例如,在Spring Data Neo4j中使用Neo4j bean创建应用程序上下文时,行val ctx = new ClassPathXmlApplicationContext(...)会调用一些代码,这些代码会根据注释在Neo4j中创建索引。

这样的步骤应该通过在构造函数/工厂方法中使用静态方法来实现(在Scala中它可能是一些伴随对象)?如果是这样,如果我不想显式调用初始化代码,我将如何继续,这意味着我第一次使用来自我的库初始化的东西发生但它被缓存在某处 - 我正在考虑使用惰性val来存储我的库所需的信息在这种情况下。

1 个答案:

答案 0 :(得分:2)

  

应该通过使用静态方法来实现这样的步骤   构造函数/工厂方法(在Scala中它可能是一些   伴侣对象)?

不,初始化这个词意味着状态,并且全局状态是反模式。我真的很喜欢casbah的设计方式:

import com.mongodb.casbah.Imports._
val mongoClient = MongoClient("localhost", 27017)

val database = mongoClient("test")
// now the actual work with databases and encompassed collections 
db.collectionNames
val coll = db("test")
...

现在,我可以拥有多个客户端实例,这不仅对主应用程序代码非常有用,而且对于测试非常有用。此外,如上所述,将所有内容都放在对象中可能会使多线程应用程序出现问题。

  

如果是这样,如果我不想显式调用,我将如何继续   初始化代码,意思是我第一次使用我的东西   库初始化发生但它被缓存在某个地方 - 我是   考虑使用惰性val来存储我的所需信息   在这种情况下库。

为什么不推出类似会话(即上面代码中的MongoClient)对象并将所有内容缓存在其中?

仅供参考,loan pattern,它与您的查询没有直接关系,但在您实施scala API时这是一个不错的选择