我有一个单例对象,它为我的应用程序处理数据库的东西,但是我想在测试期间使用一个类似的类,这样我就可以拥有许多不会相互干扰的小型测试数据库。
我可以放弃单例并在启动时创建一个新的数据库类实例,但这意味着我必须将这个实例传递给需要数据库操作的所有地方,我不要那样。
我可以创建一个单例,它可以作为数据库类的单个实例的接口。像这样:
object DB{
val db = new Database()
def set(a:Int,b:Int) = db.set(a,b)
def get(a:Int) = db.get(a)
}
这只是一种愚蠢和毫无意义的感觉,特别是当数据库类相当大并且我必须对所有方法都这样做时。有没有更好的方法来解决这个问题?
谢谢!
答案 0 :(得分:2)
实现这一目标的最佳方法是使用蛋糕模式,但您必须确实扩展DB
类中的所有方法。
为了做到这一点,我会遵循这篇文章:http://www.warski.org/blog/2014/02/using-scala-traits-as-modules-or-the-thin-cake-pattern/
创建蛋糕模式后,您只需要有一个特性来实现"其他数据库"仅用于测试源代码的测试。当然,这个特性实现了真正的DB"在主要源代码上。
答案 1 :(得分:0)
在我看来,你的问题涉及到一个类的多个不同的内容,并且能够作为单个对象访问它们。为清楚起见,请注意这些事情是矛盾的。
因此,您需要组合来引用您想要使用的任何实际实例。然后直接公开这个实例(DB.instance.doSomething()
)或者像你提到的那样转发API。
对我来说,你对这些中的任何一个都不满意。如果语法DB.instance
困扰您,您始终可以将此实例放在 package object 中并直接使用它。您也可以import DB._
直接访问instance
变量。