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();
我熟悉 the Builder Pattern and method chaining,但我不知道如何调整其中任何一个。据我了解,@Service-类 是 Spring Boot.
中的单例
Spring 引导是否完全可行?
如果您想在此处使用流畅的界面,则由您的 getDocuments()
方法 return 编辑的对象必须是方法链的起点。也许创建一个类似 DocumentFilter
class 的东西,你可以从那里 return,然后你会得到这样的东西:
documentService.documents().getDocuments().withDate(LocalDate date).withName(String name).getDocuments()
在此示例中,您的 DocumentFilter
将具有 withDate(...)
和 withName(...)
方法,并且每个后续调用都包含前面 DocumentFilter
中的所有条件。
不必是 Spring 引导解决方案,为什么不直接引入类似 POJO 构建器的本地 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;
}
}
}
如果不需要访问父组件,显然将其设为静态。
你 可以 使 Spring 组件和构建器成为同一个对象,但这确实让人觉得做作,而且我希望你能够支持多个建设者。
此外,我假设父组件是真正的服务,即它不包含任何状态或修改器,否则您会引入潜在的同步问题。
编辑:仅供说明,构建器维护要传递给 otherService
的参数并执行任何类似服务的转换。
我正在为工作构建一个 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();
我熟悉 the Builder Pattern and method chaining,但我不知道如何调整其中任何一个。据我了解,@Service-类 是 Spring Boot.
中的单例Spring 引导是否完全可行?
如果您想在此处使用流畅的界面,则由您的 getDocuments()
方法 return 编辑的对象必须是方法链的起点。也许创建一个类似 DocumentFilter
class 的东西,你可以从那里 return,然后你会得到这样的东西:
documentService.documents().getDocuments().withDate(LocalDate date).withName(String name).getDocuments()
在此示例中,您的 DocumentFilter
将具有 withDate(...)
和 withName(...)
方法,并且每个后续调用都包含前面 DocumentFilter
中的所有条件。
不必是 Spring 引导解决方案,为什么不直接引入类似 POJO 构建器的本地 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;
}
}
}
如果不需要访问父组件,显然将其设为静态。
你 可以 使 Spring 组件和构建器成为同一个对象,但这确实让人觉得做作,而且我希望你能够支持多个建设者。
此外,我假设父组件是真正的服务,即它不包含任何状态或修改器,否则您会引入潜在的同步问题。
编辑:仅供说明,构建器维护要传递给 otherService
的参数并执行任何类似服务的转换。