我有一组全部从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

如果重写了它,并且有多种实现,则一种方法是使用验证器工厂来获取验证器并进行验证。我什至不知道这是否适合您的用例,但这是我所能提供的所有信息。
希望它能以某种方式对您有所帮助。

07-24 09:21