在控制器或服务中放置业务逻辑,哪个更好?

3
我正在开发一个Spring Web MVC应用程序。我有一个与CRUD或复杂操作相关的查询。
我的问题是逻辑放在控制器还是服务层?
目前,我将所有代码编写在控制器中,并在控制器中调用service的save()或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 我觉得这不是我问的问题。他们只讨论了依赖性的问题。你对我的问题有什么想法吗?麻烦回答一下。 - Bwt Developer
1个回答

6
是的,您可以了解何时使用服务层的一些知识?您可以从Service Layer的用途 stack overflow来自docs.oracle.com的业务逻辑实现开始。

现在,如果我们看一下您问题中提到的两种方法,那么第一种情况“在控制器中编写业务逻辑”并不是您应该采取的方式。

因此,我肯定会选择第二部分,因为当您拥有服务层时,您应该在那里编写业务逻辑。

@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 所以控制器的角色只是处理请求并将其路由到特定路径,对吗?而服务层则处理所有事务和业务逻辑,对吗? - Bwt Developer
@BwtDeveloper 你为什么在@我,是不是本来想@ Dushyant? - Mark Rotteveel
1
是的 @BwtDeveloper,你明白了。 - Dushyant Tankariya
当我们有一个预先制作的应用程序(使用jhipster配置),并且每个JPA实体都有自己的控制器/服务/存储库相关联时,我们该怎么办?我的意思是,实现一些需要从不同存储库中提取数据并最终返回结果的复杂业务逻辑的好策略是什么?谢谢。 - funder7
嗨@Funder,对于回复的延迟我感到抱歉。当使用jhipster配置并且每个JPA实体都有自己的控制器/服务/存储库相关联时,建议使用默认架构来实现业务逻辑。也许可以扩展任何架构,你可以更改jhipster创建的架构并构建自己的架构 - 这是我不建议的,除非对项目架构有完全的了解。 - Dushyant Tankariya
嗨 @DushyantTankariya,没问题!:-) 谢谢你的建议,事实上我正在保留原始架构,我的意思是与需要包含多个存储库的服务一起工作。事实上,我已经创建了另一个与jhipster生成的内容分离的服务。这样做可以避免重新导入jdl文件时的冲突! - funder7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接