可以将工厂模式(工厂方法,简单工厂方法和抽象工厂)或服务定位器模式获取依赖关系的方式称为依赖注入。
我的理解是通过这种实例化依赖关系的方式,高级类仍然需要了解有关Factory或Service定位器的信息。依赖注入意味着依赖项被推送而不是像工厂类型那样被拉动,最好的方法是使用Inversion of Control容器,如NInject,Unity,CastleWindsor等。请分享您的观点。
答案 0 :(得分:4)
依赖注入和服务定位器是two opposing ways to program to interfaces,但依赖注入解决了大多数问题和挑战,远远优于Service Locator anti-pattern。
摘要工厂可以注入需要它们的服务中,因此可以与两种方法结合使用。它们与讨论not a variation of Service Locator完全相同。
答案 1 :(得分:1)
不,他们不能。
依赖注入是一种实现IoC或控制反转的模式。这意味着,类不应该彼此紧密耦合,也不应该知道从哪里获取它们的依赖。
控制原理的反转通常表示为“不要打电话给我们,我们会打电话给你” - 在这种情况下,由IoC容器管理的类不应该知道它们的依赖关系以及如何获取它们。工厂模式和服务定位器意味着,使用类实际上知道有关获取该依赖关系的方法。
<强>更新强>
我还要引用Martin Fowler:
基本选择是服务定位器和依赖关系 注射。第一点是两种实现都提供了 在天真的例子中缺少基本的脱钩 - 两者兼而有之 案例应用程序代码独立于具体实现 服务接口。两者之间的重要区别 模式是关于如何提供实现的 应用程序类。使用服务定位器,应用程序类要求 它明确地通过消息发送给定位器。注射没有 显式请求,服务出现在应用程序类中 - 因此 控制倒置。