2016-06-10 56 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