这个问题是关于基于主要值(value)对象和服务的可测试软件设计。
下面是一个简单服务的 API 示例,该服务可以将数据保存到文件中。
saveToFile(data, fileName)
saveToUniqueFile(data, fileNameGenerator)
fileNameGenerator
是一项生成随机文件名的服务。它用于查找保存数据的唯一文件名。在此示例中,fileNameGenerator
作为方法参数注入(inject)。
替代方案之一是构造函数注入(inject),它可以简化 API:
saveToFile(data, fileName)
saveToUniqueFile(data)
当然不会每次都使用保存到唯一文件,因此似乎不需要强制构造函数参数。另一方面,服务通常通过数据进行通信,这里我们有一个服务,它确实使 API 有点困惑。
将服务作为方法参数传递是否存在任何潜在的问题/不便?在这种情况下,构造函数注入(inject)是否仍然是首选?
最佳答案
将服务作为参数传递是很成问题的,因为你永远不知道什么时候需要它们。 Methods and their parameters constitute your API, whereas the constructor doesn't 。使用构造函数注入(inject)服务为您提供了更大的自由度,因为它允许您将依赖项与方法所表达的 API 解耦。
否则,您必须将方法参数传递给 API 中的所有方法,以防其中一两个方法可能需要它。
偶数when a service is only used once in a while, it's rarely an issue通过构造函数注入(inject)它们。
关于language-agnostic - 注入(inject)很少使用的服务 - 构造函数与方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7111462/