2015-02-09 4 views
0

У меня небольшая проблема. Для архитектуры без потерь я использую инъекцию зависимостей. Как я могу поделиться этим зависимым преобразователем между моими другими классами? Должен ли этот резольвер статический класс с глобальным статическим списком некоторых экземпляров, или я должен сделать это не статическим и передать этот резольвер над свойством или конструктором для других классов? Я думаю, вы должны сделать это не статическим, потому что если вы сделаете это с помощью однотонального статического резольвера, у вас есть зависимость от этого резольвера.Как использовать преобразователь зависимостей?

+0

Sry, я разработчик .Net-разработчик –

+0

Можете ли вы пометить его и не забыть всегда отмечать. – SMA

+0

Не имеет значения, какие языки, принц DI ist всегда один и тот же. Я только хочу знать, как другой класс должен иметь доступ к распознавателю. С передачей в конструкторе или со статическим резольвером. –

ответ

1

У вас может быть два типа резольвера.

  • Один, где ваша зависимость получает решить с помощью конструктора, как:

    MyClass myClass; 
    public MyConstructor(MyClass myClass) { 
        this.myClass = myClass; 
    } 
    
  • Или другой способ заключается в использовании сеттер инъекции с использованием сеттером метода как:

    public void setMyClass(MyClass myClas) { 
        this.myClass = myClass; 
    } 
    

Есть другие шаблоны проектирования, такие как фабричные или одноэлементные, которые используют статический метод и на основе входного параметра, который они производят другой объект, который вы могли бы использовать, но его вообще отличался от DI и мог помочь в DI.

+0

В вашем примере myClass является зависимым преобразователем? –

+0

Его фактическая зависимость от вашего класса. Ваш класс не должен концентрироваться на том, как получить мои зависимости, а должен сосредоточиться на бизнес-логике. – SMA

+0

@Macel, no. myClass не является преобразователем dependecy, это зависимость. –

1

Много было сказано и написано об этом, но общее мнение состоит в том, что имея глобальный «распознаватель» (так называемый Service Locator pattern) является anti-pattern:

проблема с Service Locator является то, что она скрывает зависимые от класса , что приводит к ошибкам во время выполнения вместо ошибок времени компиляции, , а также к тому, что сделать код более сложным для поддержания, потому что он становится неясным, когда вы вводите нарушение.

Вместо использования этого глобального резольвера вы должны использовать шаблон oposite: Injection Dependency (DI). С помощью DI вы вводите зависимости в класс, по сравнению с тем, чтобы позволить классу запрашивать зависимость через какой-либо преобразователь. Наиболее распространенный - и обычно лучший способ сделать это - использовать инъекцию конструктора. Это означает, что конструктор некоторого класса определяет зависимости, которые он требует в качестве аргументов конструктора в классах sole constructor.

Конструктор классов должен содержать только зависимости, которые этот класс использует напрямую. Зависимости, которые необходимы для зависимостей классов, не должны подвергаться этому классу, потому что это только увеличивало бы связь между вашим кодом и затрудняло бы проверку вашего кода, что было бы труднее рассуждать.

Результатом этого является то, что не из классов в вашем приложении будет отвечать за создание и запрос их зависимостей. Каждый класс подталкивает эту ответственность к цепочке вызовов, приводя к тому, что в приложении есть одно место в приложении, рядом с пуском вашего приложения, которое отвечает за построение всех графиков объектов: composition root.

Корень композиции - это место, где вы можете использовать такой резольвер, но это необязательно.

Смежные вопросы