我一直在考虑如何通过提供简单的固定公共API来平衡使用依赖注入的可测试设计。我的困境是:人们希望做类似的事情var server = new Server(){ ... }
,而不必担心创建a Server(,,,,,,)
可能具有的许多依赖关系和依赖关系图。在开发过程中,我不必担心太多,因为我使用IoC / DI框架来处理所有这些事情(我没有使用任何容器的生命周期管理方面,这会使事情进一步复杂化)。
现在,依赖关系不太可能重新实现。在这种情况下,组件化几乎纯粹是为了可测试性(和体面的设计!),而不是为了扩展等而创建接缝。人们将有99.999%的时间希望使用默认配置。所以。我可以对依赖项进行硬编码。不想这样做,我们会丢失测试!我可以提供一个带有硬编码依赖关系的默认构造函数,以及一个带有依赖关系的构造函数。那是...杂乱无章,可能令人困惑,但可行。我可以将接收构造函数的依赖项设置为内部,并使我的单元测试成为一个朋友程序集(假定为C#),它整理了公共API,但留下了一个隐藏的陷阱供维护。在我的书中,具有两个隐式连接而不是显式连接的构造函数通常是不好的设计。
目前,这是我能想到的最少的邪恶。意见?智慧?