2011-03-10 61 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

相关问题