C#中DTO(数据传输对象)和代理对象的区别

5

在Entity Framework中,使用了DTO和代理对象这两个术语。我感到困惑的是,如果DTO用于传输状态,为什么还要使用代理对象?


你在什么上下文中阅读这个 ProxyObject?顺便说一句,你真的不应该在 EF 中使用 DTOs。 - Aron
实际上,我正在使用一个 WebModel,并使用 AutoMapper 将 WebModel 映射到实体类。然后当我保存实体时,我如何能够从我映射到实体的 WebModel 中获取生成的 ID(自动递增)?所以这是一个 DTO 模式还是什么? - user3603255
2个回答

5

代理对象是继承自模型类的对象,但添加了一些功能,如状态管理。通常这样做是为了使您的模型不必继承任何特殊类。

数据传输对象不是来自于您的模型,但它们表示相同的数据。通常用于与不知道您的模型的服务进行通信。


3

DTO和代理对象并不是EF的概念,而是一般性的概念。

DTO(数据传输对象)是专门用于在应用程序的各层或服务之间传递数据的对象。使用DTO的原因有很多,但大多数时候是因为在各个层或服务之间所需的信息不同。例如:

  • 您有一个带有许多属性的实体,但服务客户端或另一层只需要其中几个:创建一个具有所需属性的DTO,将原始实体的属性映射到DTO中,并在服务/层上公开该DTO。

  • 您需要公开一个具有来自不同实体的属性的对象:创建一个具有所有必需属性的DTO,将实体中的属性映射到DTO中并将其公开。例如,您可能需要一个扁平对象,它具有来自一个EF实体和与之相关的“主表”(例如与FK相关联的描述或名称)的属性。

  • 您需要公开不同形状的实体、聚合数据或其他任何更改...

您可以以许多方式实现映射:例如创建一个接受原始实体作为参数的DTO构造函数,创建一个静态类并为映射创建静态方法。您可以使用像ValueInjecterAutoMapper之类的东西使映射变得更容易。有时,您甚至可以直接使用它们而无需实现任何其他内容来进行映射。但是,如果映射有点复杂,通常必须手动进行一些映射。

代理对象是完全不同的东西。它是表示另一个对象的对象。也就是说,它基本上行为类似于原始对象,但与其不同。这通常是为了向对象添加额外的功能,同时保持其与原始意图的兼容性。例如,可以通过代理对象拦截登录或验证方法调用。通常的技术是使用框架从原始对象动态继承,并添加所需的行为(这是典型的AOP技术)。

在实体框架中,你可以找到"更改跟踪代理"。这些对象是动态创建的,从原始实体继承,但添加了一些功能,使它们能够跟踪其更改:它们可以保存原始值、更改后的值、新状态等,并允许它们实现延迟加载。由于它们是原始对象的子类,所以它们具有相同的属性,但不同的行为。这里是EF代理的简短描述

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接