我正在尝试学习Ruby / Rails中的依赖注入。如何使用依赖注入删除Builder
对Saw
的显式引用?
class Builder
attr_reader :saw
def saw
@saw ||= Saw.new(4)
end
def cut_wood
Saw.saw
end
end
class Saw
attr_reader :blades
def initialize(blades)
@blades = blades
end
def saw
# do something
end
end
答案 0 :(得分:4)
将Saw
的初始化移至默认参数。
class Builder
def saw(saw = Saw.new(4))
@saw = saw
end
def cut_wood
Saw.saw
end
end
Builder#saw
现在支持依赖注入。
请务必从代码中删除attr_reader :saw
,因为它已被您的自定义阅读器覆盖。
答案 1 :(得分:3)
class Builder
def initialize(saw=Saw.new(4))
@saw = saw
end
def cut_wood
@saw.saw
end
end
# Use it
b = Builder.new
b.saw
another_saw = AnotherSaw.new
b = Builder.new(another_saw)
b.saw
您可以通过默认锯初始化Builder实例。因此,您可以使用默认值,也可以使用自己的默认值。这样你就可以将Saw与Builder分离。
顺便说一句,我不知道hammer
是不是因为我没有写它。它看起来只不过是代码中的attr阅读器。
此外,我不需要attr_read :saw
,所以我删除了它。