【问题标题】:Which layer should decide to display the next view in Spring MVC?哪个层应该决定在 Spring MVC 中显示下一个视图?
【发布时间】:2022-01-09 01:43:43
【问题描述】:

我正在使用 Spring MVC 框架构建一个应用程序,并且存在一个我无法明确解决的架构问题。我的问题是我不完全理解应用程序的哪个部分(层)应该负责控制流(流控制是指连续视图的显示 - 页面)。

Spring MVC 中的控制器是视图和应用程序之间的某种适配器。另一方面,服务是基于业务逻辑实现的。

假设我们有一个支持某个端点的控制器:

@GetMapping("/goToPageBasedOnLogic")
public ModelAndView passParametersWithModelAndView() {

    ModelAndView modelAndView = null; 
   
    // business logic calculates some stuff...
    if(fooService.bar()) { 
       modelAndView = new ModelAndView("viewPageHello");
       modelAndView.addObject("message", "hello");
    }
    else {
       modelAndView = new ModelAndView("viewPageGoodbye");
       modelAndView.addObject("message", "goodbye");
    }

    return modelAndView;
}

在上面的示例中,控制器根据 fooService 的结果决定显示哪个视图,从而管理控制流。如果条件多,可能会导致控制器代码难看。

让我们考虑下一个例子:

@GetMapping("/goToPageBasedOnLogic")
public ModelAndView passParametersWithModelAndView() {

    ModelAndView modelAndView = null; 
    
    session.fooBarResult = fooService.bar(); // logic calculates some stuff and saves in session
    State newState = stateMachine.sendEvent(PAGE_FINISHED_JOB); 
   
    if(newState == State.PAGE_HELLO) { 
       modelAndView = new ModelAndView("viewPageHello");
       modelAndView.addObject("message", "hello");
    }
    else {
       modelAndView = new ModelAndView("viewPageGoodbye");
       modelAndView.addObject("message", "goodbye");
    }

    return modelAndView;
}

在此示例中,根据服务和业务逻辑决定显示哪个视图。状态机接收到事件,然后根据会话和编码条件,决定选择下一个视图。然后控制器根据新状态准备正确的视图并返回它。控制器对控制流逻辑一无所知。

决定是否显示下一个视图(页面)的解决方案哪个更好?还有其他更有趣的解决方案吗?

【问题讨论】:

    标签: spring spring-mvc model-view-controller design-patterns architecture


    【解决方案1】:

    我的经验法则是:

    • 服务层不应该知道 UI 的存在。它不应该有任何关于 ui 的知识,以便服务类与 ui 解耦,并且可以在其他上下文中轻松重用(例如,将其公开为 API,未来的另一个新 ui 等)所以如果你发现有服务类需要依赖 spring-mvc 或 servlet 等的某些类,应该会出错。

    • 与ui相关的逻辑,例如下一个要显示的屏幕应该放在控制器层中。

    • 控制器层应该保持薄。尽量将业务逻辑代码推送到服务层。

    所以控制器层应该决定下一个要显示的视图。放在服务层是没有意义的。否则服务层将与 UI 耦合(见我的第 1 点)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 2014-01-24
      相关资源
      最近更新 更多