2011-08-18 72 views
2

这个问题是关于基于价值对象和服务的可测试软件设计。注入很少使用的服务 - 构造函数vs方法

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

saveToFile(data, fileName) 
saveToUniqueFile(data, fileNameGenerator) 

fileNameGenerator是生成随机文件名的服务。它用于查找保存数据的唯一文件名。在这个例子中,fileNameGenerator作为方法参数被注入。

其中一个备选方案之一是构造函数注入这将简化API:

saveToFile(data, fileName) 
saveToUniqueFile(data) 

保存到一个唯一的文件肯定不会每次都使用,所以它似乎是一个强制性的构造函数的参数不应该需要。另一方面,服务通常通过数据进行通信,这里我们有一个服务,它确实让API变得杂乱无章。

作为方法参数传递服务时是否存在任何潜在的问题/不便之处?在这种情况下施工人员注射是否应该首选?

回答

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使用通过构造函数注入它们。

0

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

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