【问题标题】:Writing database library in Scala - initialization code在 Scala 中编写数据库库 - 初始化代码
【发布时间】:2014-05-30 07:21:19
【问题描述】:

我想用 Scala 语言为Neo4j 数据库编写小型库。这个库将与Neo4j 数据库对话,并且主要将类映射到节点。我想让它像spray-json library: https://github.com/spray/spray-json

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

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

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

【问题讨论】:

    标签: scala library-design


    【解决方案1】:

    是否应该通过在 构造函数/工厂方法(在 Scala 中可能是一些 伴生对象)?

    不,initialization 这个词暗示状态并且具有全局状态是反模式。我真的很喜欢 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 时这是一个不错的选择

    【讨论】:

    • 感谢您的回答,您可能对每个会话缓存和避免全局状态是正确的,我将查看Casbah 源代码以获得一些灵感。
    • 注意,Casbah 被认为是 scala 的 v1 mongo api,还有 new-wave ReactiveMongo,它针对异步操作,虽然我不能说太多,因为我没有这方面的工作经验。
    猜你喜欢
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 2015-11-30
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多