簡體   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