Language agnostic 注入很少使用的服务-构造函数与方法

Language agnostic 注入很少使用的服务-构造函数与方法,language-agnostic,dependency-injection,Language Agnostic,Dependency Injection,这个问题是关于基于主要价值对象和服务的可测试软件设计 下面是一个简单服务的API示例,它可以将数据保存到文件中 saveToFile(data, fileName) saveToUniqueFile(data, fileNameGenerator) fileNameGenerator是一种生成随机文件名的服务。它用于查找要保存数据的唯一文件名。在本例中,fileNameGenerator作为方法参数注入 替代方案之一是构造函数注入,这将简化API: saveToFile(data, fileN

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

下面是一个简单服务的API示例,它可以将数据保存到文件中

saveToFile(data, fileName)
saveToUniqueFile(data, fileNameGenerator)
fileNameGenerator
是一种生成随机文件名的服务。它用于查找要保存数据的唯一文件名。在本例中,
fileNameGenerator
作为方法参数注入

替代方案之一是构造函数注入,这将简化API:

saveToFile(data, fileName)
saveToUniqueFile(data)
当然,不会每次都使用保存到唯一文件,因此似乎不需要强制构造函数参数。另一方面,服务通常通过数据进行通信,这里我们有一个服务,它确实会使API有点混乱


将服务作为方法参数传递是否存在任何潜在问题/不便?在这种情况下,是否仍应首选构造函数注入?

这取决于在程序上下文中,saveToUniqueFile()方法“所属”是否更有意义。如果您使用的对象在逻辑上应该能够保存自己,那么请使用构造函数注入。如果对象的保存由另一个较大的对象或服务管理,则使用方法参数thing


如果将服务作为方法参数使用,请确保通过引用传递它。

将服务作为参数传递是很有问题的,因为您永远不知道何时需要它们。使用构造函数注入服务给了您更大的自由度,因为它允许您将依赖项与方法表示的API分离

否则,您必须将method参数传递给API中的所有方法,以防其中一个或两个可能需要它

甚至可以使用构造函数来注入它们