如何使用依赖注入而不是服务定位器

时间:2011-03-28 14:37:05

标签: dependency-injection inversion-of-control service-locator

我听到有人说你不应该使用Service Locator进行依赖注入。那么如何在不依赖服务定位器的情况下注入依赖项呢?我想尝试IoC容器,但不想陷入反模式。

你是否应该设置一切所以有一个地方所有类总是有最深层的依赖链? (如果我/它有意义的话)

我认为所有代码都依赖于所选的IoC容器是不对的,是吗?

那么你在哪里“使用”你的容器(用于重新解析)?你如何解决所有问题,就像你的代码一样深入?它是通过在每层直到前层使用接口来正确设计所有内容的一部分吗?

或者我只是错过了一点?

让我提醒你,我只是不想陷入反模式,需要一些提示/提醒它。

1 个答案:

答案 0 :(得分:6)

  

你应该如何设置一切   所有课程都有一个地方   总是有一个依赖链   最深的课程? (如果我/那个   感觉到了)

是的,这称为应用程序的组合根,您可以在此配置IoC容器并解析根类型。

  

拥有所有代码是不对的   充斥着对IoC的依赖   容器的选择,是吗?

正确,最好不要在类型周围传递对IoC容器的引用,因为这会使它们不再可重用,并且通常会将类型与IoC容器的概念结合起来。

  

那么你在哪里“使用”你的   容器(用于重新解决)?怎么做   你可以解决所有问题   你的代码深入了吗?是它的一部分吗?   以正确的方式设计一切   通过使用每个接口   一层直到前层?

您可以在组合根目录中使用容器,并在代码中的任何位置使用容器(通常用于依赖链支持)来实例化类型(即来自工厂类型)。

许多IoC容器可以为您生成这些工厂类型,因此您只需要传递,例如IMyFactory作为依赖项,或者在某些IoC容器中,Func<IMyService>。这意味着您不需要创建依赖于IoC容器的工厂类型。

在使用接口方面,依赖性倒置原则声明您应该依赖于抽象而不是结构,因此如果您希望采用依赖注入,则需要考虑这个概念。