2011-03-10 37 views
1

在我的應用程序(JRuby中,軌道3,mongodb的)設置我的數據訪問對象(和其他「單身」)在初始化/config/initializers/app_constants.rbrails 3 - 在哪裏把應用程序啓動初始化的東西?

DATA_COLLECTION_STORE = DataCollectionStore.new(...) 

SOME_OTHER_SINGLETON = SomeOtherClassTreatedLikeSingleton.new(...) 

我是新來的軌(和紅寶石),我意識到一些事情。首先,設置這些「單例」不能是正確的方法,因爲這些類可以隨時在代碼中的任何其他地方實例化(現在假定不會發生)。其次,當我嘗試運行測試(rake spec)或構建WAR(使用warble)時,將這些「常量」放入此初始化器中似乎是錯誤的b/c我可以看到初始化器的內容正在運行,所以我正在創建與mongo的連接,開始我的「some_other_singleton」等。

這種東西應該去哪裏?

預先感謝與我noobness :)

回答

2

你不需要任何配置文件實際初始化單例耐心。 相反,你可以在你的類中實現一個返回單例的類方法。下面的代碼將允許ü使用DataCollectionStore.instance

class DataCollectionStore 
    @@instance = DataCollectionStore.new 

    def self.instance 
    @@instance 
    end 

    def initialize 
    #intitialize you instance here 
    end 

end 

請記住,你將不得不config.cache_classes設置爲true,development.rb這在你的開發環境中工作訪問的單身。雖然在生產中默認緩存類。

或者,您可以將該類本身用作單例對象,並在類方法中實現您的功能。

如果您的初始化費用很高,您可以使用下面的代碼片段進行拖延操作。這樣,如果您的測試實際調用實例類方法,您只需支付價格。 您可以在您的應用中通過在視圖中輸出DataCollectionStore.instance並使用不同的瀏覽器加載頁面來測試此功能。如果每件事情都正確,你應該在兩個瀏覽器中看到相同的時間戳。

class DataCollectionStore 
    @@instance = nil 

    def self.instance 
    @@instance || @@instance = self.new 
    end 

    def initialize 
    @initialized_time = Time.now 
    end 

    def to_s 
    @initialized_time 
    end 
end 
+0

感謝您的想法。但是另一個在「初始化器」中設置/啓動的問題呢?要運行一個簡單的RSpec控制器測試,需要將近50秒,因爲它首先執行那些使我的應用程序創建到數據庫連接的初始化程序,加載一些數據和其他東西。 – codecraig 2011-03-10 12:34:52

+0

那麼你可以讓實例類方法懶洋洋地創建任何昂貴的資源。這樣,如果您的測試實際需要調用實例方法,那麼您只會受到打擊。 – Alternegro 2011-03-10 16:48:23

相關問題