0

我想Neo4j用 Scala 语言编写小型数据库库。该库将与Neo4j数据库对话,主要将类映射到节点。我想让它像spray-json图书馆一样工作:https ://github.com/spray/spray-json

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

例如,Spring Data Neo4j当您使用Neo4jbean 创建应用程序上下文时,该行会调用一些基于注释val ctx = new ClassPathXmlApplicationContext(...)创建索引的代码。Neo4j

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

4

1 回答 1

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")
...

所以现在,我可以拥有多个客户端实例,这不仅对主应用程序代码很有用,而且对测试也很有用。此外,正如您在上面提出的那样,将所有内容都放在对象中可能会使多线程应用程序变得复杂。

如果是这样,如果我不想显式调用初始化代码,我将如何进行,这意味着我第一次使用库初始化中的某些内容时会发生但它被缓存在某处 - 我正在考虑使用惰性 vals 来存储我的库所需的信息在这种情况下。

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

仅供参考,贷款模式,它与您的查询没有直接关系,但是当您实现 scala API 时这是一个不错的选择

于 2014-05-30T08:09:31.497 回答