我想问一下建筑模式。我写了两段代码来演示我的问题。
第一种方式是:
//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
}
*注意:代码从商店实体映射到控制器层中的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;
}
*注意:代码从商店实体映射到服务层中的shopDTO。
我使用Spring框架代码作为示例。
我的问题是:哪个是放置映射器代码的最佳层。你能告诉我为什么吗?
旁边,应该在控制器层上放置什么类型的逻辑以及应该在服务层上放置什么?
感谢。
答案 0 :(得分:1)
第二种方式更好。
原因是,您希望在图层之间进行某些抽象。控制器应该通过它的id来获得商店。这样,您可以更改映射和检索数据的方式,而无需更改控制器。然后,您应该进入下一步,思考如何在数据访问层和服务层的边界上最好地设计抽象。
关于控制器中的逻辑。在控制器中,您应该放置与传入请求相关的逻辑以及API的最终响应。也许你可以做一些验证(尽管最好通过拦截器执行),提取标头值并使用它们执行操作并拥有最终的异常处理子句,以便不会在API外部溢出任何内容并且您可以使用正确的HTTP 5xx进行回复响应。一般情况下,控制器不应该有大型方法,它们是主要用于公开API端点的方法。