Я пытаюсь увеличить свое знание «Инверсия управления» и обнаружил какой-то код, который хотел бы знать, - это настоящий 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 должно действительно происходить в классе, создавшем этот класс.
Вы правы. Этот код полностью побеждает цель IoC и заканчивается тесно связанными типами. Похоже, они создали конструктор IoC только для целей модульного тестирования, а не для того, чтобы обнимать его как общую методологию проектирования. – itsme86
Спасибо, @ itsme86 - вот о чем я беспокоился. Когда я спрашиваю об этом, меня спрашивают: «Помимо модульного тестирования, нет никакой другой причины для IoC», и я не уверен, как ответить. Я считаю, что заявление недействительно, и есть множество причин, но я не могу их отобрать. Вы можете помочь? – Craig
Я предполагаю, что [это] (https://en.wikipedia.org/wiki/Coupling_ (computer_programming) #Disadvantages) очень хорошо описывает недостатки жесткой связи. – itsme86