Ruby / Rails依赖注入

时间:2013-08-19 09:53:59

标签: ruby-on-rails ruby dependency-injection

我正在尝试学习Ruby / Rails中的依赖注入。如何使用依赖注入删除BuilderSaw的显式引用?

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

2 个答案:

答案 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,所以我删除了它。