理解IoC和DI有什么好的比喻?
答案 0 :(得分:7)
如果你采用汽车的经典例子。您可以通过常规汽车购买流程并采取制造商为您提供的轮子:
public class Fifteens
{
public void Roll() { Console.WriteLine("Nice smooth family ride..."); }
}
public class Car
{
Fifteens wheels = new Fifteens();
public Car() { }
public void Drive() { wheels.Roll; }
}
然后:
Car myCar = new Car();
myCar.Drive() // Uses the stock wheels
或者您可以找到一个自定义的Car构建器,它允许您准确指定您希望Car使用哪种类型的车轮,只要它们符合车轮的规格:
public interface IWheel
{
void Roll();
}
public class Twenties : IWheel
{
public void Roll() { Console.WriteLine("Rough Ridin'...");
}
public class Car
{
IWheel _wheels;
public Car(IWheel wheels) { _wheels = wheels; }
public void Drive() { wheels.Roll(); }
}
然后:
Car myCar = new Car(new Twenties());
myCar.Drive(); // Uses the wheels you injected.
但是现在你可以注入你想要的任何类型的轮子。请记住,他只是一种依赖注入(构造函数注入),但它是最简单的示例之一。
答案 1 :(得分:2)
Martin Fowler表现出色explaining those patterns。
答案 2 :(得分:2)
有几种不同的类比可以让理解控制反转变得更容易。我们在常规生活中以许多不同的方式体验这一点,因此我们在代码中借用表单。一个类比被称为军队中的“指挥链”。
这可能是与控制反转最明显的平行。军方为每个新兵提供他所需要的基本事物,并发布新兵必须遵守的命令。同样的原则适用于代码。每个组成部分都有实例化实体所需的规定(即这个类比中的指挥官)。然后,实例化实体对该组件的行为采取行动。
更多信息: