繁体   English   中英

Spring 引导服务中的流畅接口

[英]Fluent Interface in Spring Boot Service

我正在为工作构建一个 Spring 引导项目。 在这个项目中,我的服务任务是从另一个后端获取某些文档。 有很多不同的场景,其中文档必须满足某些标准,例如来自某个日期,可以自由匹配。 目前这是通过正常方法完成的,如下所示:


@Service
public class DocumentService(){

  private OtherService otherService;

  @Autowire
  public DocumentService(OtherService otherService){
    this.otherService = otherService;
  }

  public List<Document> getDocuments() {
   ...
  }

  public List<Document> getDocuments(LocalDate date) {
   ...
  }

  public List<Document> getDocuments(String name){
   ...
  }

  public List<Document> getDocuments(String name, LocalDate date){
   ...
  }

}

我发现这是一个相当糟糕的解决方案,因为对于每个新组合都需要一种新方法。 出于这个原因,我想为此使用流畅的样式界面,如下所示:

//Some other class that uses DocumentService
documentService().getDocuments().withDate(LocalDate date).withName(String name).get();

我熟悉 构建器模式方法链,但我看不到如何适应其中任何一个。 据我了解,@Service-classes 是 Spring Boot 中的单例。

Spring 引导是否有可能?

如果您想在此处使用流畅的接口,您的getDocuments()方法返回的 object 必须是方法链的起点。 也许创建一个类似DocumentFilter class 的东西,你可以从那里返回,然后你会得到这样的东西:

documentService.documents().getDocuments().withDate(LocalDate date).withName(String name).getDocuments()

在此示例中,您的DocumentFilter将具有withDate(...)withName(...)方法,并且每个后续调用都包含来自前面DocumentFilter的所有条件。

不一定非得是 Spring 引导解决方案,何不直接引入类似 POJO builder 的本地 class:

@Service
public class DocumentService(){
    public Builder documents() {
        return new Builder();
    }

    public class Builder {
        private LocalDate date;
        private String name;

        public Builder withDate(LocalDate date) {
            this.date = date;
            return this;
        }

        // etc

        public List<String> get() {
            final List<SomeDTO> results = otherService.doQuery(name, date, ...);
            // TODO - tranform DTO to List<String>
            return list;
        }
    }
}

如果不需要访问父组件,显然将其设为 static。

可以使 Spring 组件和构建器是相同的 object 但这确实让人觉得做作,而且我希望您能够支持多个构建器。

另外我假设父组件是真正的服务,即它不包含任何 state 或突变体,否则您将引入潜在的同步问题。

编辑:只是为了说明,构建器维护 arguments 以传递给otherService并执行任何类似服务的转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM