首页 > 解决方案 > 菜单中存储库或服务类的方法

问题描述

我正在用 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 时向用户显示我的数据库中的所有电影院。我有两种方法可以做到这一点:

  1. 只需在 MenuService 中实现我的 CinemaRepository 并写入 option1 方法

cinemaRepository.findAll()

  1. 在 MenuService 中实现 CinemaService 并在此 CinemaService 中创建一个方法来从 db 中查找我的所有电影院
@RequiredArgsConstructor
public class CinemaService {

    private final CinemaRepository cinemaRepository;

    public List<Cinema> findAll() {
        return cinemaRepository.findAll();
    }
}

之后只需在 option1 方法中执行:

cinemaService.findAll();

什么是正确的方法?直接从我的 MenuService 中的存储库执行方法或实现 CinemaService 并从那里的存储库中隐藏该方法。

谢谢你的帮助!我想学习好的编程实践

标签: javasqlservicerepository

解决方案


可以直接在option1()中执行cinemaRepository.findAll()方法。但是,直接暴露数据层并不是一个好主意。添加CinemaService将受益于:

  1. 以数据访问层可能无法实现的方式在服务层上添加了应用程序级安全性。
  2. 您可以在服务类中添加一些验证。
  3. 您可以使用中间层并防止对 DB 的不必要调用,从而对 DB 进行最少数量的调用。
  4. 当您增强应用程序并在进行 DB 命中之前/之后添加一些逻辑时,这将非常有帮助。

对于您的情况,您可以尝试解释的两种方法,但更聪明的方法是使用CinemaService


推荐阅读