gpt4 book ai didi

java - 哪一层最适合 Java DTO 的映射器、服务层还是 Controller 层?

转载 作者:行者123 更新时间:2023-12-02 11:18:47 32 4
gpt4 key购买 nike

最近我开始思考 @Transactional 以及它的工作原理和性能,我有一个使用 spring 事务的项目,所以我有这样的代码:

@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);
}

正如你所看到的,在上面的方法中,我从数据库获取产品,然后将产品映射到 PageableProductsDTO,我怀疑我是否做对了,因为也许 dto 映射应该是在 Controller 层完成?而且似乎在服务层进行此类映射会延长事务本身花费的时间,我的意思是从性能角度来看可能不太好?

最佳答案

没有通用的解决方案,只有最适合您的解决方案。这不是关于 DTO 是模式还是反模式的问题,而是关于你是否需要它们......以及为什么

问题的一部分是您是否应该在 Controller 层或服务层重新打包数据。这完全取决于您是否引入了 DTO 来分离应用程序层的数据和业务逻辑或者您引入了 DTO 来重新打包将返回给客户端的数据(可能会删除一些私有(private)属性)(如果是后者,则控制者应该处理该业务)。

虽然在这种情况下性能影响看起来可以忽略不计,但您应该1在单独的方法中移动从数据库加载数据的逻辑,并将其2标记为事务性。

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

2只要您想在执行数据库加载后提交事务,这将是一个很好的模式。如果您想重复使用从数据库加载数据的方法,请考虑其他用例以及是否想延长提交时间。

关于java - 哪一层最适合 Java DTO 的映射器、服务层还是 Controller 层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50080537/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com