Где управление инвертировано в Inversion of Control - PullRequest
4 голосов
/ 15 января 2012

Я потратил много времени на понимание ioc. Я никогда не понимаю, как именно управление инвертируется в этом паттерне. Даже меня смущает точное значение инверсии. В нормальном английском языке инверсия - это нечто вроде реверса, скажем, реверса чашки.

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

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

Любая помощь приветствуется.

Ответы [ 3 ]

5 голосов
/ 15 января 2012

Старый стиль:

Class car
{
  Engine _engine;
   Public Car()
   {
       _engine = new V6();
   }
}

перевернутая:

Class car
{
   Engine _engine;
    Public Car(Engine engine)
    {
        _engine = engine;
     }
}

var car = new Car(new V4());

Звонящий имеет контроль вместо класса автомобиля

2 голосов
/ 15 января 2012

Зависимость впрыска инвертирует управление.

Например, класс автомобиля нуждается в классе двигателя. Двигатель может быть любым типом двигателя.

Если вы не используете DI, класс автомобиля будет определять сам тип двигателя, класс автомобиля находится под контролем.

При использовании DI код, создающий экземпляр автомобиля, будет определять тип автомобиля (например, указав двигатель в конструкторе), теперь вызывающий код находится под контролем. Управление преобразуется из класса автомобиля в код вызова.

0 голосов
/ 15 января 2012

Чтобы развернуть ответ Робина:

IUserRepository _user  = new UserRepository();
//you're in control of which instance is created.

С внедрением зависимости:

IUserRepository _user;// you will not do anything else. 

Основываясь на конфигурации где-то еще, используемая вами структура внедрения зависимости позаботится о создании право экземпляр для вас.Это когда управление инвертировано из вашего кода.Вы не создаете напрямую какой-либо экземпляр из своего кода.

Почему !?Зачем ты это делаешь?

Одним из основных преимуществ является тестирование, когда вы запускаете тесты, вы можете настроить свой IUserRepository на поддельный.

...