是否应该避免服务对象的动态依赖?

Ree*_*Ree 3 language-agnostic unit-testing dependency-injection

这个问题是关于主要基于价值对象和服务的可测试软件设计.

使用DI容器时,具有静态依赖关系的服务可以直接实例化或配置.但是,在某些情况下,服务需要仅在运行时已知的依赖项.

比如说,想象一个简单的FileSystemDataStore,其中包含一些用于管理目录中文件的CRUD方法.此服务需要一个目录名作为其构造函数参数之一.该名称只能在运行时知道,并且必须由其协作者提供.

这似乎有些问题,因为由于其动态特性,您无法在DI容器中配置此类服务.您可能必须使用工厂来创建此类服务.但是,这将导致服务客户的单元测试中的怪癖.您将不得不模拟工厂返回服务的模拟.这增加了单元测试的额外复杂性.返回嘲笑的模拟通常被认为是测试气味.

你对这个问题有什么看法?这是你的经历中的问题吗?这些服务应该重构为更"纯粹"吗?

Mar*_*ann 6

作为一般观察,当服务依赖于运行时值时,抽象工厂确实是适当的响应.

但是,正如问题中所指出的,这确实会影响测试的可维护性,因此如果您可以重新设计API以避免这种情况,那么您应该这样做.但这并不总是可能的.