2013-08-19 4 views
3

Я пытаюсь узнать об инъекции зависимостей в Ruby/Rails. Как удалить Builder с явной ссылкой на Saw с использованием инъекции зависимостей?Инъекция зависимостей Ruby/Rails

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

необходимо передать в инициализацию, подумайте над созданием BuilderFactory – apneadiving

+0

В классе Saw вы можете использовать 'attr_accessor: builders' s =' Saw.new' 's.builders =" asdasdasd "', а также s.builders # для fet результат набора так, чтобы геттер и сеттер были завершены для строителей, который зависит от пилы. –

+0

изменен. Builder # hammer to Builder # увидел, что стало больше смысла – Harry

ответ

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 из вашего кода, потому что он переопределяется вашим пользовательским читателем.

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 пилой по умолчанию. Таким образом, вы можете использовать либо по умолчанию, либо использовать свой собственный. Таким образом вы отделили Пилу от Строителя.

Кстати, я не знаю, hammer для этого я не писал. Это выглядит не что иное, как читатель attr в вашем коде.

Также мне не нужна необходимость attr_read :saw, поэтому я удалил его.