在实体框架中,这两个术语用于DTO和代理对象。我很困惑,如果DTO用于转移状态,那么为什么使用这个代理对象?
答案 0 :(得分:4)
代理对象是从模型类继承的对象,但添加了一些功能,如状态管理。通常使用此方法,以便您的模型不必从任何特殊类继承。
数据传输对象是不属于您的模型的对象,但它们代表相同的数据。您通常使用它们与不了解您的模型的服务进行通信。
答案 1 :(得分:3)
DTO和代理对象不是EF概念,而是一般概念。
DTO或"数据传输对象",是专门为在应用程序的层或服务之间移动数据而创建的对象。使用DTO有几个原因,但大多数时候,层或服务之间所需的信息在层或服务方之间是不同的。例如:
您有一个具有大量属性和服务客户端的实体或另一个层只需要其中一些:创建具有所需属性的DTO,将原始属性从原始实体映射到DTO,并公开服务/层上的DTO。
您需要公开具有来自不同实体的属性的对象:创建具有所有必需属性的DTO,将实体中的属性映射到DTO并公开它。例如,您可能需要一个平面对象,该对象具有来自EF实体和"主表格的属性。与之相关的(例如与FK相关的描述或名称)
您需要公开具有不同形状,汇总数据或其他任何变化的实体......
您可以通过多种方式实现映射:例如,创建一个接受原始实体作为参数的DTO构造函数,创建一个静态类,使用静态方法进行映射。您可以使用ValueInjecter或AutoMapper之类的内容轻松完成映射。有时您甚至可以直接使用它们而无需执行任何其他操作来进行映射。但是,如果映射有点复杂,您通常必须手动进行一些映射。
代理对象完全不同。 Literraly是代表另一个对象的对象。即,和基本上与原始对象相似但与之不同的对象。通常这样做是为了向对象添加额外的功能,使其与其原始意图保持兼容。例如,可以代理对象来拦截用于登录或验证的方法调用。通常的技术是使用动态继承原始对象的框架,处理所需的行为(这是典型的technique of AOP)。
在实体框架的情况下,您可以找到更改跟踪代理的代理"。这些是从原始实体动态继承而创建的对象,但添加了一些允许它们跟踪其更改的功能:它们可以保存原始值,更改的值,新状态等。还允许它们实现延迟加载。 由于它们是原始对象的子类,因此它们具有相同的属性,但具有不同的行为。 Here is a short description of EF proxies