java - 菜单中存储库或服务类的方法
问题描述
我正在用 Java 创建简单的控制台应用程序。现在我正在用一个主要方法和几个助手来实现 MenuService :
public void mainMenu() {
while (true) {
try {
System.out.println("\n___ CINEMA MENU ___");
System.out.println("Find all cinemas - 1");
int decision = UserDataService.getInteger("___ Type option ___");
switch (decision) {
case 0 -> {
System.out.println("Goodbye!");
return;
}
case 1 -> option1();
default -> System.out.println("No option with this number");
}
} catch (Exception e) {
e.printStackTrace();
throw new MenuServiceException("Failed");
}
}
}
private void option1(){
//do some work
}
从这个菜单用户将能够执行各种操作。假设我想在用户输入 1 时向用户显示我的数据库中的所有电影院。我有两种方法可以做到这一点:
- 只需在 MenuService 中实现我的 CinemaRepository 并写入 option1 方法
cinemaRepository.findAll()
- 在 MenuService 中实现 CinemaService 并在此 CinemaService 中创建一个方法来从 db 中查找我的所有电影院
@RequiredArgsConstructor
public class CinemaService {
private final CinemaRepository cinemaRepository;
public List<Cinema> findAll() {
return cinemaRepository.findAll();
}
}
之后只需在 option1 方法中执行:
cinemaService.findAll();
什么是正确的方法?直接从我的 MenuService 中的存储库执行方法或实现 CinemaService 并从那里的存储库中隐藏该方法。
谢谢你的帮助!我想学习好的编程实践
解决方案
可以直接在option1()中执行cinemaRepository.findAll()方法。但是,直接暴露数据层并不是一个好主意。添加CinemaService将受益于:
- 以数据访问层可能无法实现的方式在服务层上添加了应用程序级安全性。
- 您可以在服务类中添加一些验证。
- 您可以使用中间层并防止对 DB 的不必要调用,从而对 DB 进行最少数量的调用。
- 当您增强应用程序并在进行 DB 命中之前/之后添加一些逻辑时,这将非常有帮助。
对于您的情况,您可以尝试解释的两种方法,但更聪明的方法是使用CinemaService
推荐阅读
- python - 检查列表python中是否有相同的值
- mysql - MySQL ID 在另一列中重新打印不起作用
- spring-boot - 使用spring data elasticsearch注释查询并仅返回特定的嵌套字段
- ansible - 找不到尝试异步和轮询任务的工作
- azure - 操作返回无效状态代码“未授权”
- reactjs - 更改语言环境时刻 js
- reactjs - 我如何使用反应光滑的滑块来实现网格轮播布局
- c# - 替换 Azure 逻辑应用中的字符串
- powershell - 如何在与 Get-ChildItem 的结果相同的位置添加文本文件?
- windows - 如何仅将 websocket 请求从 apache windows 重定向到另一台服务器?