如果一个依赖只在一个方法中使用,我应该注入它还是使用服务位置?
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 可以帮助您将对象重构为更易于管理的大小。较小的对象通常需要较少的依赖关系,因为它们需要管理的问题要少得多。
有大量关于依赖注入模式的文档和书籍。扩大搜索范围以查看未应用于特定框架(甚至语言)的一般模式和实践可能会很好,它可以帮助您了解自己代码中的最佳实践。
我对依赖注入有点陌生,工作时遇到了相关问题。
假设我有一个 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 可以帮助您将对象重构为更易于管理的大小。较小的对象通常需要较少的依赖关系,因为它们需要管理的问题要少得多。
有大量关于依赖注入模式的文档和书籍。扩大搜索范围以查看未应用于特定框架(甚至语言)的一般模式和实践可能会很好,它可以帮助您了解自己代码中的最佳实践。