当前位置: 首页 > 知识库问答 >
问题:

如何在控制器、服务和存储库模式中使用DTO

房育
2023-03-14

我遵循控制器、服务和存储库模式,我只是想知道DTO在哪里。

控制器是否应仅接收DTO?我的理解是你不想让外界知道底层域模型?

从域模型到DTO的转换应该发生在控制器层还是服务层?

共有3个答案

曹华荣
2023-03-14

一个简单的答案可能是:DTO(如果您需要,请参阅下文)允许您将特定信息传输到其他地方。这是控制器/适配器/存储库/无论您如何称呼它的任务。适配器的任务是从外部世界(系统边界之外)获取信息,并将这些信息转换为相应的域模型,以便服务逻辑能够使用它。

而且,在我看来,这也适用于html" target="_blank">存储库:存储库将数据持久化到外部系统(例如数据库或其他REST服务),并在请求时将其带回。为此,它可能需要将域模型转换为简化的DTO,以便能够持久化到目标系统中。

适配器的思想是,业务逻辑不需要知道如何转换要在REST/SOAP/MySQL/中表示或通过REST/SOAP/MySQL/传输的对象。。。协议这就是适配器的任务。因此:如果需要,DTO应该留在适配器中。

DTO是系统内部数据的另一种抽象。你也应该想想你是否真的需要它们。你可能会也可能不会,这取决于你想对这些信息做什么。如果使用自己编写查询的数据库(这意味着您没有使用ORM映射器)持久化数据,您可能根本不需要DTO,因为您可以直接从域模型中提取相关信息。

另一方面,如果您对对象使用反序列化程序(如Jackson for JSON或类似的东西),您可能会发现自己需要DTO,因为这些工具有时需要一些特殊要求,以便能够将数据序列化和反序列化为对象。在这里,您可能需要先使用DTO,然后才能将其转换为域对象,反之亦然。

顺便说一句:这个问题在软件工程方面也得到了很好的回答。斯塔克交换。通用域名格式

那安宁
2023-03-14

不同的组织遵循不同的模式。这取决于你遵循的模式。根据我个人的经验,我遵循下面的架构图。

如上图所示,DTO到实体对话,反之亦然,将只在服务层内。

年良骏
2023-03-14

在今天使用Spring MVC和交互式UI编程时,web应用程序实际上有4层:

>

  • UI层(Web浏览器,JavaScript)

    MVC控制器,即用@Controller

    服务层,即。用@Service注释的Spring组件

    带注释的Spring代码的数据访问层

    每次这些层中的一个与底层交互时,它们都需要发送/接收数据(通常为POJO),以便在层之间传输数据。这些POJO是DTO,也称为数据传输对象。

    各层之间仅应使用DTO,且它们不一定相同,例如,服务层可将业务逻辑应用于从数据访问层接收的DTO,因此服务层API的DTO不同于数据访问层API。类似地,控制器可以重新排列数据以准备呈现(分组、摘要等),因此,发送到web浏览器的数据与从服务层接收的数据不同。

    无论是使用JDBC技术,还是使用JDBC技术,检索数据都应该反映出数据访问的完整性。这意味着实体类不应位于数据访问层之外。

    大多数项目不需要这种抽象级别,因此DTO通常是一个实体类,从数据访问层一直流到控制器,在控制器中由视图使用,或发送到web浏览器,编码为JSON。

    这取决于项目的规模和复杂性。项目越大,使每个层尽可能抽象/独立就越重要。

  •  类似资料:
    • 我使用Spring Boot和Spring数据。 我认为把存储库层和服务层分开是没有问题的 null null 在我的控制器中,我必须从UserService调用方法,有时还必须从UserRepository调用方法。目前,我将两者都注入到控制器中,并调用service或repository 我只是问,因为我混淆了在同一个类中注入两者和调用其中一个或另一个 另一方面,这意味着在服务层重复方法,如下

    • 我正在用Symfony制作简单的应用程序。我在这里配置了服务 我的服务使用存储库(例如,评论服务使用评论存储库),这里是的构造函数 性质 构造函数: 当我试图运行我的应用程序我得到这个错误 PHP致命错误:未捕获Symfony\Component\DependencyInjection\Exception\AutowiringFailedException:无法自动连线服务“AppBundle\R

    • 我已经为CRUD创建了spring应用程序。我可以很容易地写入服务器数据,如字符串,长,blob,但当我试图从服务器检索它。我遇到了服务器的字节数组在服务器的BigInteger中给出的困难。我怎样才能在字节数组中获得数据而不是BigInteger?当我在插入字节数组中写入该数据时,该数据的列是BLOB。这是我的代码 储存库

    • 我试图在Spring boot 2中编写一个测试类,其中: 我想测试一个控制器 我想嘲笑一个仓库 我想按原样注入一个服务(即不嘲笑它) 该类看起来像: 的(唯一)实现是用注释的,并允许通过其构造函数注入仓库: 运行测试时,我得到了一个,大致上说是“没有可用”。 我怀疑我可能需要一个特定的测试配置来获得服务,但是我被可用的在线文献弄糊涂了。 有指针吗?

    • 我有一个名为UserRepository的通用存储库接口。然后我有一个接口,它从MyUserRepository扩展而来。它处理一个MyUser类,该类扩展了User。 我还有一个名为UserService的服务接口和一个名为MyUserServiceImpl的类。 该服务需要UserRepository的实例,我虽然可以使用某种注释,如@Qualifer,但它不起作用。 应用程序无法启动 说明:

    • 我正在尝试学习存储库模式,似乎有点困惑,当我急于加载关系并将db逻辑排除在控制器之外时,如何使用此存储库模式。 快速概述我的存储库/应用程序结构。 示例ProductInterface。php 示例类别接口。php 好的,最简单的部分是使用DI向控制器注入模型依赖关系。 列出与相关产品的所有类别更加困难,因为我不再使用雄辩的模型。我正在使用一个界面,它没有暴露所有雄辩的方法。 如果我没有在我的El