哪一层最适合Java DTO的映射器,服务层或控制器层?



最近我开始思考 @transactional及其工作方式以及性能,并且我有一个我使用春季交易的项目,因此我有这样的代码:

@Transactional
public PageableProductsDTO getUsersProducts(String userName, Pageable page) {
    PageRequest pageRequest = PageRequest.of(page.getPageNumber(), page.getPageSize(), Sort.Direction.DESC, "createdAt");
    Page<Product> pagebelProductsByUser = productRepository.findProductsByUser(userService.getUser(userName), pageRequest);
    Page<ProductDetailsDto> productDtos = pagebelProductsByUser.map(source -> {
        ProductDetails productDetails = source.getProductDetails();
        return new ProductDetailsDto(productDetails.getBarcode(), productDetails.getName(), productDetails.getPrice());
    });
    return new PageableProductsDTO(productDtos);
}

您可以看到,在上面的方法中,我从db获取产品,然后将产品映射到 pagableproductsdto ,我怀疑我是否做对了,因为也许DTO映射应该是用控制器层完成?而且,在服务层中进行这样的映射似乎会延长用于交易本身的时间,我的意思是,也许在绩效方面不好?

没有通用解决方案,只有最适合您的解决方案。这不是DTO是模式或反图案,而是您是否需要它们。...为什么

问题的一部分是您是否应该在 Controller 服务层中重新包装数据。这完全取决于您是否引入DTO将应用程序层的数据和业务逻辑分开>(如果是后者,控制器应该开展业务(。

尽管在这种情况下,性能影响看起来可以忽略不计,但您应该 1 以单独的方法中从db加载数据的逻辑,并将一个 2 标记为交易。

1 方法的分离将允许您重新使用从DB内部服务层加载数据的代码,而无需将数据重新包装回实体。

2 这将是一个很好的模式,只要您要在执行数据库加载后提交事务即可。如果您想重新使用用于从数据库加载数据的方法,请考虑其他用例,并且要延长投入。

最新更新