在我的应用程序(jruby,rails 3,mongodb)中,我在初始化程序/config/initializers/app_constants.rb中设置了我的数据访问对象(以及其他“单例”)
DATA_COLLECTION_STORE = DataCollectionStore.new(...)
SOME_OTHER_SINGLETON = SomeOtherClassTreatedLikeSingleton.new(...)
我是rails(和ruby)的新手,我意识到了一些事情。首先,设置这些“单例”不一定是正确的方法,因为这些类可以在代码中的任何其他地方实例化(现在假设不会发生)。其次,当我尝试运行测试(rake spec)或构建WAR(使用warble)时,将这些“常量”放在这个初始化器中似乎是错误的b / c我可以看到初始化器的东西正在运行所以我正在创建与mongo的连接,开始我的“some_other_singleton”等等。
这种东西应该去哪里?
提前感谢我对我的诺言的耐心:)
答案 0 :(得分:2)
您无需在任何配置文件中实际初始化单例。 相反,您可以在类中实现一个返回单例的类方法。以下代码将允许您使用DataCollectionStore.instance
访问单例class DataCollectionStore
@@instance = DataCollectionStore.new
def self.instance
@@instance
end
def initialize
#intitialize you instance here
end
end
请记住,您必须在development.rb中将config.cache_classes设置为true才能在开发环境中使用。但是,默认情况下,类会在生产中缓存。
或者,您可以将类本身用作单例对象,并在类方法中实现您的功能。
如果您的初始化很昂贵,您可以使用下面的代码片段懒散地进行初始化。这样,如果您的测试实际调用实例类方法,您只需支付价格。
您可以在视图中输出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