这个问题是关于主要基于价值对象和服务的可测试软件设计。
以下是可以将数据保存到文件的简单服务的API示例。
saveToFile(data, fileName)
saveToUniqueFile(data, fileNameGenerator)
fileNameGenerator
是一种生成随机文件名的服务。它用于查找要保存数据的唯一文件名。在此示例中,fileNameGenerator
被注入为方法参数。
其中一个替代方案是构造函数注入,它可以简化API:
saveToFile(data, fileName)
saveToUniqueFile(data)
保存到唯一文件肯定不会每次都使用,因此看起来不需要强制构造函数参数。另一方面,服务通常通过数据进行通信,这里我们有一个服务,它会使API混乱。
作为方法参数传递服务是否存在任何潜在的问题/不便?在这种情况下,构造者注射是否仍然是首选?
答案 0 :(得分:4)
将服务作为参数传递是非常有问题的,因为您永远不知道何时需要它们。 Methods and their parameters constitute your API, whereas the constructor doesn't。使用构造函数注入服务可以为您提供更大的自由度,因为它允许您从方法表达的API中去除依赖关系。
否则,您必须将方法参数传递给API中的所有方法,以防止其中一个或两个方法需要它。
使用when a service is only used once in a while, it's rarely an issue即使是通过构造函数注入它们。
答案 1 :(得分:0)
这取决于在程序的上下文中是否更有意义saveToUniqueFile()方法“属于”。如果您正在处理逻辑上应该能够自己保存的对象,那么请使用构造函数注入。如果对象的保存由另一个更大的对象或服务管理,则使用方法参数。
如果您将服务作为方法参数使用,请确保通过引用传递它。