Asp.net mvc DTO模式+延迟加载+实体框架+ASP.NETMVC+自动映射器

Asp.net mvc DTO模式+延迟加载+实体框架+ASP.NETMVC+自动映射器,asp.net-mvc,entity-framework,lazy-loading,automapper,dto,Asp.net Mvc,Entity Framework,Lazy Loading,Automapper,Dto,首先,很抱歉提出了这么长的问题,但我必须提供一些基本信息 我们正在创建一个应用程序,它使用ASP.NETMVC、JQuery模板、实体框架、WCF,并且我们使用POCO作为域层。在我们的应用程序中,有一个WCF服务层与ASP.net MVC应用程序交换数据,它使用数据传输对象DTO从WCF传输到MVC 此外,在我们的WCF服务层中将域转换为DTO时,应用程序使用AutoMapper在实体框架中使用延迟加载 我们的后端架构如下:WCF服务->管理器->存储库->实体框架POCO 在我们的应用程序中

首先,很抱歉提出了这么长的问题,但我必须提供一些基本信息

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

此外,在我们的WCF服务层中将域转换为DTO时,应用程序使用AutoMapper在实体框架中使用延迟加载

我们的后端架构如下:WCF服务->管理器->存储库->实体框架POCO

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

通常,我们有普通和Lite DTO用于领域,例如Customer、CustomerLite等,Lite对象的属性比普通对象少

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

比如说,

我们有客户视图页面和DTO层次结构,如下所示

 public class CustomerViewDetailsDTO
 {
   public CustomerLiteDto Customer{get;set;}
   public OrderLiteDto Order{get;set;}
   public AddressLiteDto Address{get;set;}
 }
在这种情况下,我们不希望此视图的某些字段为OrderLiteDto。但其他一些视图需要该字段,因此为了方便使用该字段,我们使用该结构

当涉及到自动映射时,我们将CustomServiceWdeTailsData映射到,并且我们将从延迟加载实体框架中获得特定视图不需要的额外数据

我的问题是:

在考虑可维护性的同时,我们是否可以使用任何机制来提高性能

对于相同的DTO,是否可以将Automapper与更多基于地图视图的映射功能一起使用


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

SELECTN+1是一种数据访问反模式,其中数据库 以次优方式访问

换句话说,使用延迟加载而不急于加载集合会导致实体框架转到数据库,并一次返回一行结果

对模板使用jsRender,因为它比JQuery模板快得多: 关于如何使用它,这里有一个很好的信息:

一般来说,我们有普通的和精简的DTO用于领域,如客户, CustomerLite等Lite对象的属性很少

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

在考虑可维护性的同时,我们是否可以使用任何机制来提高性能

对一个视图使用一个ViewModel,您就不必担心可维护性。就我个人而言,我通常创建一个作为基础的abtract类,对于“编辑”、“创建”或“列表”,我继承该类并添加特定于视图的属性。例如,创建视图不需要PropertyId,因为有人可以劫持您的帖子并发布它,所以只有编辑和列表视图模型才会暴露PropertyId属性

对于相同的DTO,是否可以将Automapper与更多基于地图视图的映射功能一起使用

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

AutoMapper的一个缺点是来自域对象的投影 仍然强制查询和加载整个域对象

资料来源:

您可以使用一组目前受到限制的扩展来加速数据访问代码中的映射:


关于

冗长?我希望每个问题都这么简短:谢谢你的回答,我真的很感激。有时,关闭延迟加载是一个危险的过程,因为我们必须手动包含必要的连接。我同意你的观点,N+1问题和延迟加载应该小心处理。我们通常使用实体分析器来分析实体框架的性能。我们并没有在持久层中使用自动映射器。基本上,我同意一个视图的一个视图模型,在我们的情况下,它将成为一个DTO的一个页面,这是不友好的维护。没问题。是的,efprofiler是一款很棒的软件。如果这是您需要的信息,请将其标记为答案。