【问题标题】:ASP.NET MVC + EF 4.1 layering, models, viewmodelsASP.NET MVC + EF 4.1 分层、模型、视图模型
【发布时间】:2011-10-31 09:37:59
【问题描述】:

我阅读了一些与 ASP.NET 中的分层架构相关的文章和问题,但是在阅读过多之后我有点困惑。 UI 层是在 ASP.NET MVC 中开发的,我在项目中使用 EF 进行数据访问。

我想通过一个例子来描述我的问题。假设我有一个简单的博客引擎,具有以下实体:帖子、评论、类别、用户。我使用 EF 数据库方法并在我的模型层生成 POCO-s 到数据模型类库,生成的数据上下文和 EDMX 进入数据访问库。

在此之上,我有一个业务层。这负责例如返回带有 cmets 的博客条目。在我的 UI 层中,我使用 ViewModel 类,因为要显示一个条目,我需要一个 Post 实体和一个带有用户名的评论列表。

现在我的问题是:我的视图不需要用户实体的所有详细信息,只需要名称即可显示帖子。问题是我应该在哪里进行 ViewModels 和 Model 类之间的映射?业务层应该这样做吗?或者我应该返回包含所有细节的实体并让 UI 处理映射?业务层是否应该包含 ViewModel 作为类库?

最好的方法是什么?

【问题讨论】:

标签: asp.net asp.net-mvc-3 entity-framework architecture entity-framework-4.1


【解决方案1】:

问题是我应该在哪里进行 ViewModel 和 Model 类之间的映射?

最好在单独的映射层中。如果您使用AutoMapper,则可以在 ASP.NET MVC 项目的单独文件中声明映射。

业务层应该这样做吗?

绝对不是。业务层不了解任何视图模型。

业务层应该包含 ViewModel 作为类库吗?

没有。 UI 层(ASP.NET MVC 应用程序)是唯一了解视图模型的层。如果您愿意,它们当然可以在单独的类库中,但只有 UI 层应该引用它。视图模型与视图紧密耦合。视图是 UI 的一部分。

【讨论】:

  • 所以我的业务层应该返回我的模型类的每一个细节,并在 WebUI 项目中进行映射?但是这些模型类不是比它们应该的更重吗?例如,我只需要来自我的用户实体的一个属性。或者我应该为我的模型层或业务层中需要的任务引入一些新的模型类(我已经阅读了一些关于 DTO、业务实体的资料。)并将它们返回给 UI?
  • @norbip,是的,域模型可能比视图模型重。但这就是业务层返回的结果。如果您使用 ORM,您可以为关联配置延迟加载。然后,由于映射层将仅使用这些业务模型的一些关联来构建视图模型,这将不是问题。
  • 再问一个问题。如果我的业务层使用投影查询数据层怎么办。由于投影,我得到了匿名类型,但我想返回一个类型化的对象。此类型可能与模型层中已存在的类型不同。那么这种情况下,类应该在我的业务层中定义呢?
  • @norbip,执行投影时不应返回匿名对象。该类应定义在执行投影的同一层中,以替换匿名对象。因此,如果您在业务层执行投影,那么模型应该定义为业务层中的域模型。
【解决方案2】:

您好,我更喜欢在 UI 层中使用 ViewModel。我阅读了 Steven Sanderson 的 Pro ASP.NET MVC 3 Framework 一书。而在这本书的例子中,有很多ViewModels的例子,我推荐阅读这本书。

【讨论】:

    猜你喜欢
    • 2010-11-18
    • 2010-11-24
    • 2014-01-07
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    相关资源
    最近更新 更多