asp.net-mvc - DTO 模式 + 延迟加载 + Entity Framework + ASP.Net MVC + 自动映射器

标签 asp.net-mvc entity-framework lazy-loading automapper dto

首先,对于冗长的问题很抱歉,但我必须提供一些基本信息。

我们正在创建一个使用 ASP.net MVC、JQuery 模板、 Entity Framework 、WCF 的应用程序,我们使用 POCO 作为我们的域层。在我们的应用程序中,有一个 WCF 服务层与 ASP.net MVC 应用程序交换数据,它使用从 WCF 到 MVC 的数据传输对象 (DTO)。

此外,在 WCF 服务层中转换域到 DTO 时,应用程序通过使用 AutoMapper 在 Entity Framework 中使用延迟加载。

我们的后端架构如下( WCF Services -> Managers -> Repository -> Entity Framework(POCO) )

在我们的应用程序中,我们不使用 View 模型,因为我们不想要 MVC 应用程序的另一个映射层,我们只使用 DTO 作为 View 模型。

通常,我们有针对 Customer、CustomerLite 等域的 Normal 和 Lite DTO( Lite 对象的属性比 Normal 少)。

现在我们在 DTO 方面遇到了一些困难,因为我们的 DTO 结构变得越来越复杂,当我们考虑可维护性(使用 DTO 的一般分层结构)时,我们失去了性能。

例如,

我们有客户 View 页面和我们的 DTO 层次结构如下

 public class CustomerViewDetailsDTO
 {
   public CustomerLiteDto Customer{get;set;}
   public OrderLiteDto Order{get;set;}
   public AddressLiteDto Address{get;set;}
 }

在这种情况下,我们不希望此 View 的某些 OrderLiteDto 字段。但是其他一些 View 需要该字段,因此为了方便我们使用该结构。

当涉及到自动映射时,我们映射 CustomerViewDetailsDTO,我们将从延迟加载( Entity Framework )中获取额外的数据(特定 View 不需要)。

我的问题:
  • 有没有什么机制可以在考虑可维护性的同时提高性能?
  • 是否可以将 Automapper 与更多基于 map View 的映射功能用于相同的 DTO?
  • 最佳答案

    首先不要使用延迟加载,因为它可能会导致 Select N+1 问题或类似问题。

    Select N + 1 is a data access anti-pattern where the database is accessed in a suboptimal way.



    换句话说,在没有预先加载集合的情况下使用延迟加载会导致 Entity Framework 转到数据库并将结果一次带回一行。

    将 jsRender 用于模板,因为它比 JQuery 模板快得多:
    Render Bemchmark
    这是关于如何使用它的一个很好的信息:Reducing JavaScript Code Using jsRender Templates in HTML5 Applications

    Generally, we have Normal and Lite DTOs for domain such as Customer, CustomerLite, etc (Lite object is having few properties than Normal).



    您的普通 DTO 可能是 ViewModel,因为 ViewModel 可能会也可能不会一对一映射到 DTO,并且 ViewModel 通常包含从 View 推回的逻辑,或者帮助将数据推回用户响应的模型。
    DTO 没有任何行为,其目的是减少应用程序层之间的调用次数。

    Is there any mechanism that we can use for improving performance while considering the maintainability?



    对一个 View 使用一个 ViewModel,您将不必担心可维护性。就我个人而言,我通常创建一个抽象类,它是一个基础类,对于编辑、创建或列表,我继承该类并添加特定于 View 的属性。因此,举个例子,创建 View 不需要 PropertyId(因为有人可以劫持您的帖子并发布它),所以只有 Edit 和 List ViewModels 公开了 PropertyId 属性。

    Is it possible to use Automapper with more map view based mapping functions for same DTO ?



    您可以使用 AutoMapper 来定义每张 map ,但问题是 map 会有多复杂。每个 View 使用一个 ViewModel,您的 map 将很容易编写和维护。我必须指出,不建议在数据访问代码中使用 Automapper,因为:

    One downside of AutoMapper is that projection from domain objects still forces the entire domain object to be queried and loaded.



    来源:Autoprojecting LINQ queries

    您可以使用一组目前受限的扩展来加速数据访问代码中的映射:Stop using AutoMapper in your Data Access Code

    问候

    关于asp.net-mvc - DTO 模式 + 延迟加载 + Entity Framework + ASP.Net MVC + 自动映射器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10908889/

    相关文章:

    asp.net-mvc - MVC + EF Code First 多对多关系 : Create view with checkbox

    javascript - RequireJS - Marionette ItemView 上的延迟加载模板

    c# - 强制创建惰性对象

    class - 延迟加载 webp 图像 - 如何添加类

    asp.net-mvc - 如何删除 MVC 网站中的所有当前域 cookie?

    c# - 在 ASP.net MVC 中划分大任务的最佳实践

    C# SQL 查询阻塞服务器内存

    c# - 使用 Entity Framework 加入 View 时使用 .Include()

    asp.net-mvc - 从视频中获取图像

    javascript - 如何使用 razor Comment on JavaScript block/