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

If a dependency is only used in a single method, should I inject it or use service location?

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

假设我有一个 class 'Employee',它有一个方法,这个方法说 'Promote' 在最罕见的情况下也有条件地调用它。

'Promote' 方法使用 'ValueAddition' 的对象,现在最好的做法是通过构造函数和用户全局对象注入这个对象,还是我应该 解决方法本身的依赖关系?

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

一般来说,您应该始终寻求注入依赖项而不是使用服务位置(即,直接从控制反转容器解析依赖项)。 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 可以帮助您将对象重构为更易于管理的大小。较小的对象通常需要较少的依​​赖关系,因为它们需要管理的问题要少得多。

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