【问题标题】:Where to put business logic, in controller or service? [duplicate]在哪里放置业务逻辑,在控制器或服务中? [复制]
【发布时间】:2019-11-29 00:43:24
【问题描述】:

我正在开发一个 Spring Web MVC 应用程序。我有与 CRUD 或复杂操作相关的查询。

我的问题是将我们的逻辑放在哪里,在控制器层还是在服务层?

目前,我正在控制器中编写所有代码,并在controller 中调用servicesave()delete() 方法。

请参阅下面的代码示例。请帮助我找到正确的编码方式。

控制器级别:

@Controller
@RequestMapping(value = "/Shipping")
public class ShippingController {

 @Autowired
 private ShippingService shippingService;


 @RequestMapping(value = "/addNewShippingMethod/{id}", method = RequestMethod.POST)
 public String addshippingMethod(@PathVariable("id") String id, HttpServletRequest request) {
     Shipping shipping=new Shipping();
     shipping.setName(request.getParameter("name"));
     shippingService.save(shipping);
     return "/Shipping/ShippingMethodList";
    }
}
@Service
public class ShippingService {
 @Autowired
 private ShippingMethodRespository shippingMethodRespository;

 public ModelAndView saveShippingMethod(HttpServletRequest request, String id) {    
     shippingMethodRespository.save(shipping);
 }
}

服务等级:

@Controller
@RequestMapping(value = "/Shipping")
        public class ShippingController {

        @Autowired
        private ShippingService shippingService;

        @RequestMapping(value = "/addNewShippingMethod/{id}", method = RequestMethod.POST)
        public ModelAndView addshippingMethod(@PathVariable("id") String id, HttpServletRequest request) {

            return shippingService.saveShippingMethod(request, id);
        }
}
@Service
public class ShippingService {
     @Autowired
     private ShippingMethodRespository shippingMethodRespository;

     public ModelAndView saveShippingMethod(HttpServletRequest request, String id) {
        Shipping shipping=new Shipping();
        shipping.setName(request.getParameter("name"));
        shippingMethodRespository.save(shipping);
        ModelAndView shippingMethodsPage = new 
        ModelAndView("/Shipping/ShippingMethodList");
        return shippingMethodsPage;
    }    
}

我已经描述了这两种情况第一个是:我们从控制器中保存所有数据并返回页面。

第二种是:使用控制器进行重定向和编写逻辑,并将数据保存在服务层。

您能告诉我编写代码的最佳方法是什么吗?

【问题讨论】:

  • @DushyantTankariya 我认为它与我的问题不同。因为他们只讨论了依赖关系。你对我的问题有什么想法吗?

标签: java spring-mvc spring-data-jpa


【解决方案1】:

是的,您可以收集一些关于何时使用服务层的知识?您可以以Use of Service Layer stack overflow Implementing Business Logic from docs.oracle.com 开头。

现在,如果我们查看您问题中提到的两种方式,那么它表示在第一种情况下“在 Controller 中编写业务逻辑”不是您应该采用的方式。

所以我肯定会投票支持第二部分,因为当你有服务层时,你应该在那里编写你的业务逻辑。

@Controller
@RequestMapping(value = "/Shipping")
        public class ShippingController {

        @Autowired
        private ShippingService shippingService;

        @RequestMapping(value = "/addNewShippingMethod/{id}", method = RequestMethod.POST)
        public ModelAndView addshippingMethod(@PathVariable("id") String id, HttpServletRequest request) {

            return shippingService.saveShippingMethod(request, id);
        }
}
@Service
public class ShippingService {
     @Autowired
     private ShippingMethodRespository shippingMethodRespository;

     public ModelAndView saveShippingMethod(HttpServletRequest request, String id) {
        Shipping shipping=new Shipping();
        shipping.setName(request.getParameter("name"));
        shippingMethodRespository.save(shipping);
        ModelAndView shippingMethodsPage = new 
        ModelAndView("/Shipping/ShippingMethodList");
        return shippingMethodsPage;
    }    
}

【讨论】:

  • @mark-rotteveel 所以控制器角色只是处理请求和路由到特定路径对吗?服务层正在处理所有事务和业务逻辑,对吗?
  • @BwtDeveloper 你为什么要@-ing我,你是想改用 Dushyant 说话吗?
  • 是的@BwtDeveloper,你明白了。
  • 当我们有一个预制的应用程序(配置了jhipster),并且每个jpa实体都有自己关联的控制器/服务/存储库时该怎么办?我的意思是,实现一些复杂的业务逻辑的好策略是什么,需要从不同的存储库中提取数据并最终返回结果?谢谢
  • 嗨@Funder,很抱歉延迟回复。当配置了 jhipster 并且每个 jpa 实体都有自己的控制器/服务/存储库关联时,然后使用该默认架构来实现业务逻辑 - 建议。也许任何架构都可以扩展,您可以更改 jhipster 创建的架构师并构建您自己的架构 - 在项目架构师完全了解之前,我不会建议这样做。
猜你喜欢
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
相关资源
最近更新 更多