2016-06-10 55 views
1

与性状混入到DB I具有的性状,其限定一个分贝连接:实例化一个单一的连接于油滑3.0

trait Db { 
    val db: Database = Database.forConfig("twitter-indexing-db") 
} 

然后我延伸在另一特征,其中我利用Db像这样:

trait TwitterIndexingRepository { 
    self: Db => 
    ... 
} 

最后,我实例化所需的功能的对象:

object PostgresTwitterIndexingRepository extends TwitterIndexingRepository with Db 

如果我有多个mixin,我会有多个连接/连接池打开给定的分贝?

这看起来有点不好, Spring DI,你会得到一个连接,并在需要的地方注入它。

+0

简短答案是肯定的,使用一个对象或者你可以注入的类你的postgres持久化类。 –

+0

我想通过一个隐含的''包含所有的全局实例,如数据库连接,记录器等来解决这个问题。 –

回答

0

这看起来像你试图使用cake pattern

如果这是你想用什么,在Db特质应该使用def,并PostgresTwitterIndexingRepository应该用val覆盖:

trait Db { 
    def db: Database 
} 

object PostgresTwitterIndexingRepository 
    extends TwitterIndexingRepository with Db { 
    override val db = Database.forConfig("twitter-indexing-db") 
} 

这只会创建一个数据库实例,为你想要的。正如评论者所说,你也可以使用其他方法来确保只创建一个实例 - 构造函数参数,隐含的构造函数参数,全局单例等。

+0

是的,我想使用蛋糕模式,因为它允许我在没有框架的情况下执行DI并且测试东西是微风。 你能否给出一个解释,为什么你在anser中建议你会确保我得到一个实例? 另外,当你说构造参数我假设你暗示使用类而不是特质? 我尽量避免隐含。 – zaxme

+1

简短的回答是:因为你被迫只使用外部类提供的数据库的一个实例。从技术上讲,在你的例子中,Scala应该弄清楚所有的特性都会扩展'Db',并且只把它放在'PostgresTwitterIndexingRepository'的类层次中的一个位置。但是,如果你在另一个具体类中扩展这个特征,你会得到一个新的实例。 – jkinkead