为什么用这么多术语来表达同一件事?IoC 和 DIP

Aca*_*uza 2 dependency-injection terminology inversion-of-control

IoC = 控制反转

DIP = 依赖倒置原理(SOLID 中的 D)

IoC == DIP?我想是这样的,确实如此。

构建软件的世界已经如此混乱,为什么还要用这么多词来表达同样的事情呢?

(我知道DI (依赖注入),它与DIPIoC不同)

更新:

根据答案,我们可以说: ( DI ) + ( IoC ) = (依赖倒置原理) ?

Tru*_*ill 7

控制反转是通用术语。依赖注入是一种特定类型的 IoC。

请参阅控制反转容器和依赖项注入模式

依赖倒置原则是一个指导原则,而其他术语是对技术的描述。(IoC 也可以用来描述原理,因此这可能会令人困惑。)

用在一句话中:

Sue 遵循依赖倒置原则,在类的构造函数中使用依赖注入,并使用控制反转容器创建实例。

更新:

我不认为(DI) + (IoC) = (依赖倒置原则)是准确的。这就像说(苹果) + (食物) = (良好的营养)。每个术语都有特定的含义。

  • +1 虽然容器以 DI 为目标,所以正确的名称是“DI Container”。如果您接受 IoC 是一个通用术语(我同意),那么就不存在“IoC 容器”这样的东西。 (2认同)

def*_*mer 6

我认为你不会在这个问题上得到权威的答案,因为“IoC”这个术语有点过多,说“IoC 的真正含义是……”有点迂腐。但无论如何我都会分享我的意见:)

依赖倒置是指依赖于抽象。考虑一个HelloWorld依赖于IStringWriter和 实现类的类ConsoleStringWriter

控制反转是指框架/基础设施调用应用程序代码,而不是相反。例如,当用户关闭 WPF 应用程序时,您不会调用框架,它会引发一个您可以订阅的事件。

它们经常被结合起来。例如,Hibernate 依赖于其Interceptor 接口定义的抽象来实现 IoC。从拦截器的角度来看,控制是颠倒的——Hibernate 调用拦截器。您经常看到的另一个示例是,IHandle<T>T 是事件、命令或消息 - 基础设施在正确的时间调用处理程序。

这很令人困惑,因为我们称它们为“IoC 容器”,但您可以在不进行 IoC 的情况下进行 DI。如果你将 a 注入ConsoleStringWriteraHelloWorld我真的不认为这是 IoC,因为没有“框架”或“基础设施”。但这是因为 Hello World 很琐碎 - 随着应用程序变得更加复杂,对 IoC 的需求也会增加。

另请参阅此问题和接受的答案。