2013-03-19 76 views
2

作爲一個最簡單的例子,假設我以特定模式(例如測試)開始我的應用程序,那麼我希望能夠在應用程序的其他部分檢查我運行的模式。這應該非常簡單,但我正在尋找適合全局變量的Scala替代品。請給我多一點比:「Scala的對象是全局變量,如」在Scala中保持全局應用程序狀態的好方法是什麼?

理想的解決方案是,在啓動時,應用程序將創建一個對象,並在創建時,該對象的「模式」設置。之後,應用程序的其他部分將只能讀取'模式'的狀態。我怎樣才能做到這一點,而無需在整個應用程序中傳遞對象的引用?

我的真實場景實際上包括諸如在啓動時選擇數據庫名稱或單例數據庫對象等事情,並且在事後不允許其他任何事情來更改該對象。一個問題是我試圖在不傳遞數據庫引用的情況下實現此目的。

UPDATE:

這裏是我想要做的一個簡單的例子,而我目前的解決方案:

object DB{ 
    class PDB extends ProductionDB 
    class TDB extends TestComplianceDB 
    lazy val pdb = new PDB 
    lazy val tdb = new TDB 
    def db = tdb //(or pdb) How can I set this once at initialisation? 
} 

所以,我創建了不同的數據庫配置爲特徵。根據我的測試或生產模式是否正在運行,我想用正確的配置,其中配置看起來像:

trait TestDB extends DBConfig { 
    val m = new Model("H2", new DAL(H2Driver), 
    Database.forURL("jdbc:h2:mem:testdb", driver = "org.h2.Driver")) 

    // This is an in-memory database, so it will not yet exist. 
    dblogger.info("Using TestDB") 
    m.createDB 
} 

所以,現在,每當我使用的數據庫,我可以用這樣的:

val m = DB.db.m 
m.getEmployees(departmentId) 

我的問題確實是,這種風格很糟糕,好還是不錯(使用單例來保存數據庫句柄)。我使用的是Slick,我認爲這涉及到只有一個Slick運行的實例。這是否會導致可擴展性問題?

有沒有更好的方法來解決問題?

+0

你這是什麼意思是「給你一點以上」Scala對象就像全局變量'「?你想要一個具體的例子來說明如何用對象來做到這一點?或者你對使用objets有所保留並想要其他東西(比如'Reader' monad?在我的一些應用程序中,我創建了一個'Configuration'對象,用於從某處(如文件)讀取屬性,然後創建各種不可變屬性可用作val(只讀)。這對你有用嗎?它非常簡單,但不一定會擴展到更大的應用程序。 – huynhjl 2013-03-19 06:59:31

+0

@huynhjl我已更新我的問題,謝謝您的詢問 – Jack 2013-03-19 10:40:33

回答

4

您可以使用typesafe config library,這也用於像Play和Akka這樣的項目。 Play和Akka文檔都解釋了它的使用的基本部分。從Play documentation (Additional configuration)

指定替代配置文件

缺省是從類路徑加載application.conf文件。您可以指定,如果需要的可選配置文件:

使用-Dconfig.resource

-Dconfig.resource = prod.conf

使用-Dconfig.file

-Dconfig .file = /選擇/ CONF/prod.conf

使用-Dconfig.url

-Dconfig。URL = http://conf.mycompany.com/conf/prod.conf

注意,您可以使用include指令總是引用原始配置文件中的一個新的prod.conf文件,如:

include "application.conf"

key.to.override=blah

+0

+1非常有幫助,謝謝。 – Jack 2013-03-19 09:03:03

相關問題