【问题标题】:DTO in Entity Framework实体框架中的 DTO
【发布时间】:2011-08-19 09:28:25
【问题描述】:

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

【问题讨论】:

    标签: .net entity-framework n-tier-architecture


    【解决方案1】:

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

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

    编辑:

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

    【讨论】:

    • 我计划在我的 3 层设计的各个层中使用 EF 生成的实体,因为我想避免创建 DTO,这意味着 UI 可以直接访问 DAL(这违反了 ntier 规则) .这种方法有什么影响吗??
    • 层和层不一样。层是逻辑边界,层是物理边界。
    • 所以我真正的意思是Layer,由DLL(BL,DAL)表示的层将部署在同一台机器上。
    • 在这种情况下,只有当您构建完整的域模型(具有业务方法的实体)并且您不想将这些实体暴露给上层 (UI) 时,DTO 才能派上用场。
    • 尝试使用 EntitiesToDTOs 从您的 EDMX 自动生成 DTO 和汇编程序。它节省了大量的编码时间。
    【解决方案2】:

    当您需要传递实体的一部分或捆绑在一起的几个实体时,DTO 最有用。此外,您的实体实际上与某些实体上下文相关联,因此当您将实体传递到外部时,它们可以对其执行方法、更改数据等。如果您只想将对象传递到外部,在这种情况下,您可以受益于使用 DTO。

    【讨论】:

    • 所以您的意思是,在创建分层 EF 应用程序时,DTO 实际上是可选的?
    • 因为我不会使用 WCF/WS,它只是一个简单的单个 Web 项目。
    • 您可以不使用 DTO,但在这种情况下,您的实体会变成您的 DTO,那么您必须避免向您的实体添加方法(或使其成为内部方法),最后它会变成程序应用模型。所以,n 层是不够的,你的 n 层应用程序模型中将有多少层。由于您使用的是 EntityFramework,因此您的 DAL 和域模型是相同的,如果您不打算使用 DTO,那么您的 PresentationModel 也将是相同的,如果您不打算在 UI 层中使用视图模型,那么您将拥有一个带 1 层的 n 层应用程序
    • 对于一个简单的 Web 项目,没有 DTO 会更好。您可能在某些时候需要 DTO,例如 JSON,但在这种情况下,您可以使用匿名类型。
    猜你喜欢
    • 1970-01-01
    • 2011-08-20
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多