在控制反转中,控制在哪里被反转

时间:2012-01-15 08:17:58

标签: asp.net-mvc design-patterns inversion-of-control

我花了很多时间来理解ioc。我永远不明白在这种模式中如何完全控制。即使我对反转的确切含义感到困惑。在正常的英语 - 倒置是一些像倒车,比如倒杯。

如果我将依赖注入视为Ioc。我想知道这里的控制器究竟在哪里。我在DI中理解,依赖是在构造函数,setter ........

的帮助下从外部实体插入的

但是我从来不知道控制在这里被颠倒了......

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:5)

旧式:

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());

来电者有控制而不是汽车类

答案 1 :(得分:2)

依赖注入会反转控制。

例如,汽车类需要引擎类。发动机可以是任何类型的发动机。

如果您不使用DI,汽车类将确定发动机类型本身,汽车类是在控制中。

当使用DI时,实例化汽车的代码将决定汽车的类型(例如通过在构造函数中指定引擎),调用代码现在处于控制状态。控制从汽车类转换为调用代码。

答案 2 :(得分:0)

扩展罗宾的答案:

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

使用依赖注入:

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

根据其他地方的配置,您使用的依赖注入框架将负责为您创建正确的实例。这是从代码中反转的控件。您不是直接从代码中创建任何实例。

为什么!?你为什么要这样做?

测试的一个主要优点是,当您运行测试时,您可以使用假的IUserRepository进行配置。