使用ruby删除显式引用依赖注入

时间:2014-05-12 06:44:40

标签: ruby dependency-injection

有人可以帮我解决我的问题,我不熟悉依赖注入。 我考试了。问题是:使用依赖注入删除Car对Engine的显式引用。

class Car
  attr_reader :engine

  def engine
    @engine ||= Engine.new(4)
  end

  def move
    engine.accelerate
  end
end

class Engine
  attr_reader :cylinders

  def initialize(cylinders)
    @cylinders = cylinders
  end

  def accelerate

  end
end

有人可以帮助我吗?谢谢

2 个答案:

答案 0 :(得分:1)

它应该是这样的:

class Car
  attr_accessor :engine

  def initialize(engine)
    @engine = engine
  end

  def move
    @engine.accelerate
  end
end

现在,您已将Engine.new(4)Car类的方法engine移出到类构造函数本身。这就是为什么依赖注入在Ruby中很简单。

所以,现在你可以这样做:

Car.new(Engine.new(4))
Car.new(Engine.new(8))

我建议您在此处详细了解DI:http://solnic.eu/2013/12/17/the-world-needs-another-post-about-dependency-injection-in-ruby.htmlhttps://sporto.github.io/blog/2013/09/25/simple-dependency-injection/

答案 1 :(得分:0)

问题是如何将Engine.new移出class Car块,并在CarEngine之外添加额外的代码行,以创建带有正确实例化的引擎。

您可以阅读dependency injection on Wikipedia.这是一项非常有用的技术 - 如果您在应用中选择适用于您的类 - 请允许对应用程序进行重大的重新配置,例如:测试。

我的建议是向initialize添加Car方法,该方法接受设置属性的engine参数(删除现有的def engine块)。然后在末尾添加一行代替Car.new( Engine.new(4) )

的行

P.S。不要让dependency injectiondependency inversion感到困惑。