如果依赖项仅在单个方法中使用,我应该注入它还是使用服务位置?

时间:2018-08-31 12:34:37

标签: dependency-injection constructor lazy-loading

我对依赖注入有点陌生,在工作时遇到了问题。

让我们说我有一个'Employee'类,它具有一个方法,该方法说'Promote'在最罕见的情况下也有条件地被调用。

'Promote'方法使用一个'ValueAddition'对象,现在是通过构造函数和用户全局对象注入该对象的最佳实践,还是我应该 解决方法本身的依赖性?

推荐的最佳做法是什么?或任何解决已解决依赖项生命周期的指标都会有所帮助。

1 个答案:

答案 0 :(得分:3)

通常,您应该始终注视注入依赖性而不是使用服务位置(即,直接从控制容器的反转中解决依赖性)。 There's a great, pretty well known blog article here called "Service Locator is an Anti-Pattern" that can help clarify the reasons.

在扩展时,您可能会遇到其他问题,这些问题似乎指向您使用服务位置。通常,您确实应该围绕这些问题进行设计,而不要退回到服务位置。

  • 我只需要一个方法中的对象。请考虑将方法的功能移动到另一个对象。例如,也许Promote()方法应该在IEmployeePromoter上,您可以在其中解决该问题并采用特殊对象。然后,您将呼叫Promote(Employee)并传递员工,而不是更改Employee的依赖关系。有时,控制容器的反转将具有一种生成工厂的方式(例如Func<T>Lazy<T>),以帮助您推迟解析,直到您真正需要它为止。
  • 我有太多依赖项。通常,这意味着您的对象做得太多。 single responsibility principle可以帮助您将对象重构为更易于管理的大小。较小的对象通常需要较少的依​​赖项,因为它们要管理的问题要少得多。

关于依赖注入的模式,这里有大量的文档和书籍。不将其应用到特定框架(甚至语言)时,扩大搜索范围以查看一般的模式和实践可能会很好,并且可以帮助您通过自己的代码了解最佳实践。