dependency injection的方式

可以将工厂模式(工厂方法,简单工厂方法和抽象工厂)或服务定位器模式获取依赖关系称为dependency injection。

我的理解是通过这种实例化依赖关系的方式,高级类仍然需要了解有关Factory或Service定位器的信息。dependency injection意味着依赖项被推送而不是不同于Factory类型,并且最好的方法是使用Inversion控制容器,如NInject,Unity,CastleWindsor等。请分享您的观点。

dependency injection和服务定位器是两种相反的编程接口方式 ,但dependency injection解决了大多数问题和挑战,远远优于Service Locator反模式 。

抽象工厂可以注入需要它们的服务中,因此可以与两种方法结合使用。 它们与讨论垂直, 而不是服务定位器的变体 。

不,他们不能。

dependency injection是一种实现IoC或控制反转的模式。 这意味着,类不应该彼此紧密耦合,并且不应该知道在哪里获取它们的依赖。

控制原理的反转通常表示为“不要打电话给我们,我们会打电话给你” – 在这种情况下,由IoC容器管理的类不应该知道它们的依赖关系以及如何获取它们。 工厂模式和服务定位器意味着,使用类实际上知道获取该依赖关系的方式。

UPDATE

我还要引用Martin Fowler:

基本选择是服务定位器和dependency injection之间。 第一点是两个实现都提供了天真示例中缺少的基本解耦 – 在这两种情况下,应用程序代码都独立于服务接口的具体实现。 这两种模式之间的重要区别在于如何为应用程序类提供该实现。 使用服务定位器,应用程序类通过发送给定位器的消息明确地请求它。 使用注入没有明确的请求,服务出现在应用程序类中 – 因此控制反转。

http://martinfowler.com/articles/injection.html