在哪里放置业务逻辑,在控制器或服务中? [复制]
Posted
技术标签:
【中文标题】在哪里放置业务逻辑,在控制器或服务中? [复制]【英文标题】:Where to put business logic, in controller or service? [duplicate] 【发布时间】:2019-11-29 00:43:24 【问题描述】:我正在开发一个 Spring Web MVC 应用程序。我有与 CRUD 或复杂操作相关的查询。
我的问题是将我们的逻辑放在哪里,在控制器层还是在服务层?
目前,我正在控制器中编写所有代码,并在controller
中调用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 我认为它与我的问题不同。因为他们只讨论了依赖关系。你对我的问题有什么想法吗? 【参考方案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 创建的架构师并构建您自己的架构 - 在项目架构师完全了解之前,我不会建议这样做。以上是关于在哪里放置业务逻辑,在控制器或服务中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章