关于依赖注入:验证我理解IoC,Ioc容器,DI和服务定位器之间的区别

verifiying I understand the difference between IoC, Ioc Container, DI and service locator

阅读许多关于这3个习语之间差异的文章。但我更加困惑了,然后我偶然发现了这篇文章:http://martinfowler.com/articles/injection.html

只是想看看我是否正确。如果我错了请纠正我。请通知我更正和添加:

IOC是将应用程序与它所使用的服务实现分离的概念。应用程序包含对iService的引用,不负责启动具体服务。

实现这一目标至少有两种方法:

  • di-具体服务作为ctor参数/throw setter/throw接口注入注入(后者是什么意思?)

  • ServiceLocator是一个组件,它知道应用程序可能需要的所有具体服务。应用程序明确要求定位器提供具体的服务。

  • *IOC集装箱实际上是一个控制工厂("供应商")。

    我对文章中的"何时更喜欢(1)或(2)"部分有点困惑。有人能用外行的话从他自己的经历中分辨出来吗?

    "由于服务定位器的行为更加简单,因此它有一点优势。但是,如果您正在构建要在多个应用程序中使用的类,那么依赖注入是一个更好的选择。"-->locator如何更简单?因为它显式地使用方法调用?当有多个应用程序时,使用DI更好吗?


    IoC is the concept of decoupling an application from the implementation of a service it uses.

    的确,IOC与实现的接口分离是携手合作的,但我认为这是一个更一般的原则。这个答案很好地解释了这个概念。

    There are at least two way to achive so:
    1) DI
    2) ServiceLocator

    我不会说服务定位器模式是控制反转的一个例子。恰恰相反-当您使用服务定位器时,您以活动的方式获取所需的依赖项,没有其他人为您这样做(与DI相反,容器为您处理依赖项,您只需给它一个这样做的可能性-设置器、构造函数参数或实现注入方法接口。

    How is locator more straightforward ? because it uses method invocation explicitly?

    我认为Martin Fowler指的是IOC的一般概念,如果您以前从未见过IOC/DI概念,可能会使代码更难理解。另一方面,使用服务定位器获取某些依赖项的代码在第一次遇到时可能更容易理解。

    What is it better to use DI when there are multiple applications?

    当您创建一个应该是可重用的组件时,DI的优点是它不会使您的组件依赖于除原始依赖之外的其他任何东西(在MF的例子中,movielister在使用DI时只依赖moviefinder接口)。另外,其他人很容易使用您的组件——只需使用您提供的DI方法传递依赖项即可。

    使用服务定位器时,还可以添加对服务定位器本身接口的依赖关系。对于定位器的隔离接口,这可能不是问题。但是对于组件的用户来说,要满足组件的依赖性也可能更难,正如MF所写:

    The difference comes if the lister is a component that I'm providing to an application that other people are writing. In this case I don't know much about the APIs of the service locators that my customers are going to use. Each customer might have their own incompatible service locators.