我正在开发rails应用程序(3.2.11),并且正在使用Ruby库的单例实现服务。我尽量避免每次需要时都调用: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错误...有什么想法吗,伙计们?
发布于 2014-04-03 00:14:02
在这里使用method_missing可能是更好的主意。def_delegators在计算类时执行,甚至可能在定义方法之前执行,因为您是从基类继承的。
您可以尝试类似这样的操作,它将任何未定义的消息转发到实例:
class ServiceBase
class << self
def method_missing(name, *args, &block)
instance.send(name, *args, &block)
end
end
end与委派相比,它看起来有点像是一种分散的方法。您可以先检查实例方法是否存在,但我不认为这是必要的-您只是将未定义的方法处理转移到实例而不是类。
最后一点/问题-你能详细说明一下你从Singleton类中得到了什么好处吗?
https://stackoverflow.com/questions/22816611
复制相似问题