2016-09-14 4 views
0

Я пытаюсь увеличить свое знание «Инверсия управления» и обнаружил какой-то код, который хотел бы знать, - это настоящий IoC?- это правильная реализация IoC?

public class DepartmentLogic : IDepartmentLogic 
    { 
     private readonly IDepartmentRepository _departmentRepository; 

     public DepartmentLogic(IDepartmentRepository repo) 
     { 
      _departmentRepository = repo; 
     } 

     public DepartmentLogic() 
     { 
      _departmentRepository = new DepartmentRepository(Constants.CONNECTION_STRING_NAME); 
     } 
    } 

Если тестовый модуль вызывает этот класс, он будет проходить в издевался IDepartmentRepository. Тем не менее, весь основной код приложения использует класс со стандартным конструктором, который затем выводит информацию о конкретном DepartmentRepository.

Это правильно? Мне показалось, что я читал, что вы не должны создавать новые зависимые классы в вашем вызывающем классе, как это происходит в конструкторе по умолчанию, и что новшество конкретного отделаRepository должно действительно происходить в классе, создавшем этот класс.

+2

Вы правы. Этот код полностью побеждает цель IoC и заканчивается тесно связанными типами. Похоже, они создали конструктор IoC только для целей модульного тестирования, а не для того, чтобы обнимать его как общую методологию проектирования. – itsme86

+0

Спасибо, @ itsme86 - вот о чем я беспокоился. Когда я спрашиваю об этом, меня спрашивают: «Помимо модульного тестирования, нет никакой другой причины для IoC», и я не уверен, как ответить. Я считаю, что заявление недействительно, и есть множество причин, но я не могу их отобрать. Вы можете помочь? – Craig

+0

Я предполагаю, что [это] (https://en.wikipedia.org/wiki/Coupling_ (computer_programming) #Disadvantages) очень хорошо описывает недостатки жесткой связи. – itsme86

ответ

2

Вы предоставляете возможность иметь зависимость, введенную в класс.

Когда вы говорите, что ваше приложение просто использует конструктор по умолчанию, вы говорите, что на самом деле вы не вводили зависимость. Он по-прежнему жестко закодирован.

Вам нужно сделать еще один шаг и предоставить механизм динамического создания зависимости во время выполнения, а затем ввести его в класс (через платформу Injection Dependency или какой-либо другой настраиваемый механизм).

+0

Спасибо @ Justin ... Когда вы говорите: «Предоставьте некоторый механизм для« динамического »создания зависимости», вы имеете в виду что-то вроде Unity (контейнер IoC - следующее, что я пытаюсь лучше понять) – Craig

+1

@Craig - Правильно (поэтому почему я упомянул Framework Injection Framework). Единство - лишь один из них. Мне также нравится Autofac и nInject. –

+0

В любое время, когда вы используете «новое» ключевое слово в конструкторе, он вводит плотную связь, – loneshark99

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