我有以下课程:
类验证器 { 私有最终 SchemaFetcher schemaFetcher; @注入 验证器(SchemaFetcher schemaFetcher){...} } 类 DatabaseSchemaFetcher 实现 SchemaFetcher { @覆盖 Schema loadSchema(final SchemaDefinition schemaDef); @覆盖 boolean compareSchemaWithSource(final SchemaDefinition schemaDef, final Schema updatedSchema); }
这只是其中一个示例,我还有一些其他类似的类,我将它们作为依赖项注入到其他类中。但它使我的 SchemaFetcher 类像一个单例,我不断地将 schemaDefinition 传递给它的每个方法。这似乎非常程序化,我实际上想让 SchemaDefinition 成为 DatabaseSchemaFetcher 类的实例变量,但在这种情况下,我将无法将 SchemaFetcher 对象注入到我的 Validator 类中,而我应该这样做
验证(字符串模式名称){ SchemaDefinition schemaDef = buildSchemaDefinitionFrom(schemaName); SchemaFetcher fetcher = new DatabaseSchemaFetcher(schemaDef); }
但这使我与 fetcher 紧密耦合,这就是我想首先使用依赖注入的原因。
我可以看到我可能有一个 DatabaseSchemaFetcher 的默认构造函数,然后是一个 setSchemaDefintion() 设置器来实现这一点,但这违反了完全使用构造函数构建对象的原则。
如何改进这一点,使其没有程序样式获取器,但也将我的依赖项注入构造函数?我更喜欢构造函数注入,因为它清楚地定义了我的依赖项,而无需任何人查看类的实现来找出类在我使用工厂或服务定位器时使用的依赖项。