数据传输对象DTO生成位置
问题内容:
尝试重构一些代码。我看到一些类创建了DTO对象,这些对象正在服务层中传递,并在以后由@RestController返回。据我所知,最好仅在控制器中构建数据传输对象,并将它们传递给视图,尤其是当我们使用诸如WrapperDTO<T>
get和set
value之类的东西时。当我们使用复杂的对象或简单的数据类型构建WrapperDTO时,可能会有所不同。所有意见将不胜感激。
问题答案:
DTO可用于在应用程序的不同层之间进行数据传输:DAO,服务,外观,控制器。以我的经验,DTO是一个自以为是的话题。
我认为,转换越晚越好,如果不需要转换就更好。通常,后者位于应用程序边界。DTO不是免费的,它涉及映射及其支持。因此,当边界上存在域模型不匹配或模型技术不匹配时,DTO才有意义。有关更多信息,请查看LocalDTO文章和相关链接。
如果我专注于 服务 -> 门面 -> 控制器 层:
-
服务: 他们正在做服务的事情,他们可能会互相呼叫进行处理。如果您的域模型在服务边界上保持一致,那么
service => facade
将结果转换为DTO还为时过早。 -
外墙: 他们可以协调服务并转换输入/输出。以我的观点,这将是与DTO相互转换的正确地方。但是只有在需要的时候。因为您的域模型必须跨越此边界进行转换(过滤字段,聚合…)
-
网关/控制器:* 它们位于应用程序边界。它们的逻辑很简单,简化为边界逻辑。立面和控制器之间的关系通常是
one <-> one
。
合并立面和控制器通常很有意义
因此,以我的观点,您的第一个建议更加适应。UserController....
。最重要的是保持务实。