2011-05-05 115 views
3

我计划在EF 4中实现NTier设计。我知道EF本身基于它在数据库中映射的表创建实体。我的问题是,DTO(数据传输对象)的用途是什么?还是真的需要它?看起来它促进了冗余,因为您必须为EF生成的每个实体创建另一个DTO实体。请指导我。谢谢..实体框架中的DTO

回答

9

DTO是数据传输对象,用于仅在物理层(当层位于另一个进程或另一个服务器上)之间传输所需的数据。如果您只需要公开姓名和年龄,则不需要转移她的地址,工作单位,孩子等。因此,您将创建一个简单的运输对象,其中只包含姓名和年龄。

EF将创建将数据库记录映射到属性的实体。 EF实体也可以通过部分类扩展到具有自定义计算属性和方法的完整域对象。域对象不应直接暴露给不同的层,这是使用DTO的另一种情况。

编辑:

最后的情况DTO的使用是跨境调用优化。如果您有层级应用程序,其中一个层级调用另一个层级上的方法超出流程边界,则应尽量减少这些调用,因为这会降低性能(速度很慢)。为此,您可以创建特殊的DTO,将复杂的数据结构(多个实体)转移到远程层上的某些主操作(外观),这将进一步使用数据执行多个业务操作。

+0

我打算使用由EF生成的实体在我的3层设计层中,因为我想避免创建DTO,这意味着UI可以直接访问DAL(违反了ntier规则)。这种方法有什么含义? – clydePHI 2011-05-05 13:39:08

+0

图层和层不相同。层是逻辑边界,而层是物理边界。 – 2011-05-05 13:43:09

+0

所以我真正的意思是Layer,由DLL(BL,DAL)表示的图层将被部署在同一台机器上。 – clydePHI 2011-05-05 13:45:45

0

当您需要传递实体的一部分或捆绑在一起的几个实体时,DTO是最有用的。此外,您的实体实际上与某些实体上下文绑定在一起,因此当您将实体传递到外部时,他们可以执行其上的方法,更改数据等。如果您只想传递外部对象,则可以从中受益使用DTO。

+0

所以你的意思是,创建分层EF应用程序时,DTO实际上是可选的? – clydePHI 2011-05-05 13:36:09

+0

,因为我不会使用WCF/WS,它只是一个简单的单个Web项目。 – clydePHI 2011-05-05 13:40:31

+0

您可以不使用DTO,但在这种情况下,您的实体会变成您的DTO,那么您必须避免向您的实体添加方法(或使它们成为内部方法),最终它会变成程序化的应用程序模型。所以,n层是不够的,你将在你的n层应用模型中有多少层。由于您使用的是EntityFramework,因此您的DAL和Domain Model是相同的,如果您不打算使用DTO,那么您的PresentationModel也将是相同的,并且如果您不打算在UI层中使用View模型,那么您要对于一个简单的网络项目,有一个n层应用程序w/1层 – hazimdikenli 2011-05-05 13:55:00