避免注入服务容器而不是单个服务的技术原因是什么?
2022-08-31 00:36:17
通常,当我需要将一个或多个服务注入到另一个服务中时,我会显式注入每个服务。但是,我有一种情况,注入服务容器本身确实会使事情变得更容易。我知道这不是一个推荐的做法,但我很好奇阻止这种做法的技术原因是什么。是像资源太密集这样合法的东西,还是更个人的感觉,它太乱了?
通常,当我需要将一个或多个服务注入到另一个服务中时,我会显式注入每个服务。但是,我有一种情况,注入服务容器本身确实会使事情变得更容易。我知道这不是一个推荐的做法,但我很好奇阻止这种做法的技术原因是什么。是像资源太密集这样合法的东西,还是更个人的感觉,它太乱了?
如果注入容器,则不会明确依赖项。事实上,你比以前更模糊它们。如果你有这样的课程...
class DocumentCreator(IFileNamer fileNamer, IRepository repository)
{ ... }
...你可以看到依赖关系是什么。您还可以轻松地模拟这些依赖项以进行单元测试,以确保隔离 DocumentCreator,并且可以知道任何测试失败都是其代码的结果,而不是其依赖项之一中的代码的结果。
另一方面,如果您这样做...
class DocumentCreator(IDependencyContainer container)
{ ... }
...你已经模糊了依赖关系。如果不检查该类的内部结构,您就无法知道它需要 IFileNamer 和 IRepository。
您也无法轻易知道为了测试 DocumentCreator,您需要在容器中放入哪些模拟。嘲笑独立容器根本不会帮助你;您的类在测试中仍将失败,因为容器将不包含 IFileNamer 和 IRepository,除非您检查类的内部结构以查看它们是必需的。