存储库模式和延迟加载+ AutoMapper

时间:2013-07-09 06:13:30

标签: asp.net-mvc entity-framework lazy-loading automapper repository-pattern

我将我的项目拆分为(截至目前)4层:

  • 应用程序(ASP.NET MVC项目)
  • 域/模型(仅包含完全没有逻辑的模型)
  • BusinessLogic(现在只“包装”存储库)
  • DAL(实体框架,但应该可以互换)

MVC控制器使用业务逻辑“服务”通过业务逻辑层下面的任何内容与数据库通信,控制器不应该告诉任何人“我想要这个Student,我也是想要他所有的Courses“ - 这意味着应该使用延迟加载。

问题是,如果我只是“通过”并将结果返回给调用控制器操作的人,我无法真正控制加载的内容,除非我明确访问模型上的属性以触发图形的加载

我想使用AutoMapper从我的模型映射到Dto(每个模型一个,定义返回的内容)。

说我有这样的模型:

public class Student 
{
    public string Name {get;set;}
    public int Age {get;set;}
    public ICollection<Course> Courses {get;set;}
}

这样的dto:

public class StudentDto
{
    public string Name {get;set;}
    public ICollection<Course> Courses {get;set;}
}

当AutoMapper执行映射时,它似乎不会映射Courses,这是我的问题。

我是否应该在存储库层急切加载?

1 个答案:

答案 0 :(得分:2)

正如您在Student and StudentDto Automapper中所做的那样,应将对象图正确地映射到dto。这仅在启用延迟加载时才有效,否则您可能需要使用预先加载。

我认为选择使用哪种方法的最佳方法是测试两种方法的性能,这取决于几个因素,如db中的数据模型以及sql server和应用程序之间的延迟等。登记/> 编辑..如何选择最佳方法
如何选择最佳方法 你需要考虑三件事,

  1. 您要与数据库建立多少个连接。如果您正在使用延迟加载,则如果引用的导航属性不在上下文中,则会对导航属性的所有参考点进行数据库调用。

  2. 您将从数据库中检索多少数据如果您选择在初始查询中加载所有数据并加载不同的数据,那么当您需要检索大量数据时,这将太慢。

  3. 查询的复杂性。当您使用延迟加载时,查询将很简单,因为所有数据都未在初始查询中加载。如果您使用立即加载,则会使查询路径的查询更加复杂

  4. 了解更多here