我正在使用rails app(3.2.11),我正在使用Ruby Library实现单件服务。我试图避免每次需要时调用:instance方法(SomethingService.instance.get(some_id)
),解决我这样的问题
class SomethingService
include Singleton
class << self
extend Forwardable
def_delegators :instance, *ShoppingListService.instance_methods(false)
end
end
所以这个解决方案工作得很好,但我有很多服务,我不想把这个代码添加到我的所有课程中!相反,我试图投入这样的超级课程:
class ServiceBase
include Singleton
def self.inherited(subclass)
super(subclass) # needed because inherited is override by Singleton
class << subclass
extend Forwardable
def_delegators :instance, *self.instance_methods(false)
end
end
end
但是这给了我一个stack level too deep
错误......任何想法的人?
答案 0 :(得分:1)
在这里使用method_missing
可能更好。 def_delegators
在评估类时执行,并且可能在您的方法被定义之前发生,只是因为您从该基类继承。
您可以尝试这样的事情,将任何未定义的消息转发到实例上:
class ServiceBase
class << self
def method_missing(name, *args, &block)
instance.send(name, *args, &block)
end
end
end
与委托相比,它可能看起来像一种散射方式。您可以先检查实例方法是否存在,但我不认为这是必要的 - 您只是将未定义的方法处理转移到实例而不是类。
最后一点/问题 - 您能否详细说明您从Singleton课程中获得的好处?