放置映射器代码的最佳层是服务层还是控制器层?

Los*_*809 12 java design-patterns spring-mvc

我想问一下建筑模式。我编写了两个片段代码来演示我的要求。

第一种方法是:

//a method on controller layer (in Spring framework)
@RequestMapping(...)
public ShopDTO findShop(final Long shopId) {
    Shop shop = shopService.getShopById(shopId);
    ShopDTO shopDTO = shopMapper.toShopDTO(shop);
    return shopDTO;
}

//A method on service layer
@Transactional
public Shop getShopById(final Long shopId) {
    //some code to find an entity by id
}
Run Code Online (Sandbox Code Playgroud)
  • ShopDTO注意:从商店实体映射到控制器层的代码。

第二种方式是:

//a method on controller layer (in Spring framework)
@RequestMapping(...)
public ShopDTO findShop(final Long shopId) {
    ShopDTO shopDTO = shopService.getShopById(shopId);
    return shopDTO;
}

//A method on service layer
@Transactional
public ShopDTO getShopById(final Long shopId) {
    Shop shop = shopRepository.findById(shopId);
    ShopDTO shopDTO = shopMapper.toShopDTO(shop);
    return shopDTO;
}
Run Code Online (Sandbox Code Playgroud)
  • ShopDTO注意:从商店实体映射到服务层的代码。

例如,我使用 Spring 框架代码。

我的问题是:哪一层是放置映射器代码的最佳层。你能告诉我为什么吗?

顺便问一下,什么类型的逻辑应该放在controller层,什么类型的逻辑应该放在service层?

mar*_*art 10

第二种方法更好。

原因是,您希望在层之间有一定的抽象。控制器应该只通过 id 获取商店。这样,您就可以更改映射和检索数据的方式,而无需更改控制器。然后您应该进入下一步并思考如何最好地设计数据访问层和服务层边界上的抽象。

关于控制器中有哪些逻辑。在控制器中,您应该放置与传入请求和 API 最终响应相关的逻辑。也许你可以做一些验证(虽然大多数最好通过拦截器执行),提取标头值并用它们做一些事情,并有你的最终异常处理子句,这样就不会意外地溢出你的 API 之外,并且你可以使用正确的 HTTP 5xx 进行回复回复。一般来说,控制器不应该有大型方法,它们主要用于公开 API 端点。