我有一组全部从ReportConfig抽象类扩展的类。创建后,它们当前是不可变的,不受Spring的管理。
但是,我发现有时我需要执行一项需要使用特定服务的操作,但是我一直在努力寻找将这些服务注入非托管ReportConfig实例的最佳方法。见下文:
@Service
public class ReportService() {
@Autowired
private SchemaService schemaService;
@Autowired
private ExecutionService executionService;
@Autowired
private ReportConfigFactory reportConfigFactory;
public Result executeReport(ReportRequest request) {
ReportConfig reportConfig = reportConfigFactory.getReportConfig(request);
reportConfig.validateAgainstSchema(schemaService.getSchemaForDataset(reportConfig.getDataset()));
executionService.execute(reportConfig.getQuery());
}
现在,我对
dataService.execute()
行没有问题,但是我对reportConfig.validateAgainstSchema()
行有问题,我觉得可以选择以下替代方法:reportConfig.validateAgainstSchema(schemaService);
但我认为这可能代表紧密的耦合。
我在想还有一种直接将SchemaService注入ReportConfigs的方法,但是不确定这是否会破坏对象...
渴望听到您的想法。
谢谢
最佳答案
根据我对所提供应用程序当前设计的了解,我正在猜测其功能并正在考虑替代设计,
reportConfig.validateAgainstSchema(schemaService.getSchemaForDataset(reportConfig.getDataset()));
您可以想到的是,如果reportconfig是在不考虑更改它的情况下执行
validateAgainstSchema
的正确位置。schemaService
是执行validateAgainstSchema
的正确地方吗(我认为不是),如果它也不是正确的地方,则创建SchemaValidator
或类似的东西。利用您提供给我的信息,我可以想到这一点。
如果
validateAgainstSchema
的任何子类都未覆盖ReportConfig
,并且可能性很小,那么您绝对应该考虑将其移至其他类。我说这的原因是,如果架构发生更改,则不必更改reportConfig
类如果重写了它,并且有多种实现,则一种方法是使用验证器工厂来获取验证器并进行验证。我什至不知道这是否适合您的用例,但这是我所能提供的所有信息。
希望它能以某种方式对您有所帮助。