我需要编写具有依赖项的类。我来自.NET背景,在.NET中,我们主要使用构造函数注入将类依赖注入到类中。我已经阅读并发现大多数博客(或者至少是我见过的博客)建议使用attr_writer
(la,property)注入依赖项。
我的意思是依赖:
class Engine
end
# A car requires an engine
class Car
attr_writer :engine #Do we use attr_writer for dependencies, or..
def initialize(engine) # Do we use constructor injection?
end
end
注入依赖项的Ruby是什么? attr_writer
或构造函数注入?
答案 0 :(得分:3)
我个人更喜欢构造函数注入依赖项,因为它可以防止对象状态的泄漏。如果对象依赖于attr_writer,则使用该对象的任何人都需要知道必须设置哪些属性才能正确初始化对象的状态。
使用构造函数参数,您知道在构造函数返回时对象已正确实例化。
对我来说,来自Java背景:
engine = Engines::V8.new("vroom")
car = Car.new(engine)
比
更清洁car = Car.new
car.engine = Engines::V8.new("vroom")
因为如果我忘记提供参数,选项1会引发显式异常,而如果我忘记给汽车一个引擎,则选项2会意外失败。
我的2c。
编辑添加:使用像RubyMine这样的现代IDE,基于构造函数的注入也有助于快速建立类所具有的依赖关系,而基于attr_writer的依赖关系则不然。