Java 菜单中存储库或服务类中的方法

Java 菜单中存储库或服务类中的方法,java,sql,service,repository,Java,Sql,Service,Repository,我正在用Java创建简单的控制台应用程序。现在,我使用一种主要方法和少数助手实现MenuService: public void mainMenu() { while (true) { try { System.out.println("\n___ CINEMA MENU ___"); System.out.println("Find all cinemas -

我正在用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 my CinemaRepository中实现并写入option1方法
  • cinemaRepository.findAll()

  • 在MenuService中实现CinemaService,并在此CinemaService中创建一个从db中查找所有电影院的方法
  • @RequiredArgsConstructor
    公营电影院服务{
    私有最终存储库;
    公共列表findAll(){
    返回cinemaRepository.findAll();
    }
    }
    
    之后,只需在option1方法中执行:

    cinemaService.findAll()

    正确的方法是什么?直接从my MenuService中的存储库执行方法,或者实现CinemaService并从存储库中隐藏该方法


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

    执行cinemaRepository的方法。可以直接在选项1()中执行findAll()。但是,直接公开数据层不是一个好主意。添加影院服务将在以下方面受益:

  • 以数据访问层可能无法实现的方式在服务层上添加了应用程序级安全性
  • 您可以在服务类中添加一些验证
  • 您可以使用中间层,防止对DB进行不必要的调用,从而使对DB的调用次数最少
  • 当您增强应用程序并在DB命中之前/之后添加一些逻辑时,这将非常有用
  • 对于您的情况,您可以按照您的说明尝试这两种方法,但更明智的方法是使用CinemaService

    @RequiredArgsConstructor
    public class CinemaService {
    
        private final CinemaRepository cinemaRepository;
    
        public List<Cinema> findAll() {
            return cinemaRepository.findAll();
        }
    }