【问题标题】:Repository pattern and lazy loading + AutoMapper存储库模式和延迟加载 + AutoMapper
【发布时间】:2013-07-09 06:13:29
【问题描述】:

我已经将我的项目分成(截至目前)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,这是我的问题。

我应该在存储库层进行预先加载吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    2. 您将从数据库中检索多少数据如果您选择在初始查询中以不同的加载方式加载所有数据,当您有大量数据要检索时,速度会太慢。

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

    阅读更多here

    【讨论】:

    • 我们使用 Windows Azure 托管我们的应用程序 + 数据库,数据库是 SQL Azure - 那么急切加载会更好吗?
    • 嗯..我对此没有确切的答案。我认为最好的方法是进行一些性能测试。如果你是在开发初期,可能这不是问题需要太多的东西。您可以稍后通过一些更复杂的查询和具有一些真实业务逻辑的不同场景来决定它。因为你以后总是有两个选择。
    • Aaah - 我明白了,我认为对我们来说最好的方法是让 AutoMapper 触发延迟加载,因为我们可以为每个场景定义一个 Dto - 这将防止大型结果集。你的观点很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2012-02-15
    • 2011-02-05
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多