【问题标题】:Why so many terms to say the same thing? IoC and DIP为什么有这么多术语说同样的事情? IoC 和 DIP
【发布时间】:2011-11-11 18:31:40
【问题描述】:

IoC = 控制反转

DIP = 依赖倒置原则(S.O.L.I.D. 中的 D)

IoC == DIP?我想是的,是的。

构建软件的世界已经如此混乱,为什么要说同样的话那么多话?

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

更新:

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

【问题讨论】:

标签: dependency-injection inversion-of-control terminology


【解决方案1】:

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

Inversion of Control Containers and the Dependency Injection pattern

Dependency Inversion Principle 是一个指南,而其他术语是对技术的描述。 (IoC 也可以用来描述一个原则,所以这可能会造成混淆。)

造句:

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

更新:

我觉得(DI) + (IoC) = (Dependency Inversion Principle) 并不准确。这就像说 (Apple) + (Food) = (Good Nutrition)。每个术语都有特定的含义。

【讨论】:

  • +1 虽然容器以 DI 为目标,所以正确的名称应该是“DI Container”。如果您接受 IoC 是一个通用术语(我同意),那么就不存在“IoC 容器”之类的东西。
  • 对我来说,控制反转总是有特定的含义,即方法之间的控制流框架中被反转,客户端代码由框架调用,而不是调用框架 API。使用 library,OTOH,流程不会倒转,因为客户端代码直接调用库类/方法。 IMO,最初的“IOC 容器”支持者不恰当地使用了这个术语。
【解决方案2】:

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

依赖倒置是关于依赖于一个抽象。考虑一个依赖于IStringWriterHelloWorld 类和一个实现类ConsoleStringWriter

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

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

这很令人困惑,因为我们称它们为“IoC 容器”,但您可以在不进行 IoC 的情况下进行 DI。如果您将ConsoleStringWriter 注入HelloWorld,我并不认为这是IoC,因为没有“框架”或“基础设施”。但那是因为 Hello World 是微不足道的——随着应用程序变得越来越复杂,对 IoC 的需求也在增加。

另请参阅this question 并接受答案。

【讨论】:

  • +1 我也会区分依赖注入,它是实现根据依赖倒置原则定义的依赖的行为。
猜你喜欢
  • 2010-12-20
  • 2014-02-26
  • 2014-06-16
  • 1970-01-01
  • 2021-05-06
  • 2011-02-07
  • 2017-03-06
  • 2019-12-30
  • 2022-12-17
相关资源
最近更新 更多