在哪里放置业务逻辑,在控制器或服务中? [复制]

Posted

技术标签:

【中文标题】在哪里放置业务逻辑,在控制器或服务中? [复制]【英文标题】: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 我认为它与我的问题不同。因为他们只讨论了依赖关系。你对我的问题有什么想法吗? 【参考方案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 创建的架构师并构建您自己的架构 - 在项目架构师完全了解之前,我不会建议这样做。

以上是关于在哪里放置业务逻辑,在控制器或服务中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在哪里放置需要从数据库中获取数据的域逻辑

Lumen 中的业务逻辑应该放在哪里?

干净的架构——在哪里放置输入验证逻辑? [关闭]

在哪里放置@Transactional?在接口规范或实现中? [复制]

ASP.NET MVC 2 在哪里放置逻辑

我必须在哪里包含我的应用程序的业务逻辑? [关闭]