实体框架4 POCO和AutoMapper

时间:2011-02-24 04:59:39

标签: asp.net-mvc entity-framework-4 poco automapper

我一直在研究一种新的MVC应用程序,该应用程序利用EF4,POCO域对象和存储库< - >服务层。

我看到很多关于使用AutoMapper将EF4类映射到View模型的DTO的讨论。我的印象是,这是为了摆脱紧密绑定的EF4类。所以我的问题是因为我正在使用POCO类,我不能只使用View Models中的那些吗?或者是否仍然需要AutoMapper?

1 个答案:

答案 0 :(得分:13)

争论的焦点是你的“POCO”是你的域模型,你的View不应该关注域模型。

以这种方式思考 - 数据验证,如果你想要数据注释,你必须将它们放在你的POCO上 - 但输入验证(这个字段是必需的等)并不是真正的域关注,它是一个UI关注 - 因此使用ViewModels进行数据注释和AutoMapper。

当然,它不是切割和干燥,这是一个偏好的问题。

我也使用MVC / EF4 / POCO / AutoMapper / Service Layer,我从不绑定到POCO - 我总是使用每个View的ViewModel。

这样,您就具有良好的一致性:

  • 所有View都有ViewModel
  • POCO只有业务/域逻辑
  • ViewModel具有基本输入验证
  • 然后将它们映射到POCO,这将调用域/业务验证

**编辑 - 回应评论:**

  

您的存储库是否会返回IQueryable?如果是这样,你如何处理上下文?我的意思是你的存储库是否实现了IDisposable,然后你将它们丢弃在控制器中?

是 - 我的存储库返回IQueryable<T>,其中T是聚合根。我的存储库通过了一个工作单元(它实现了IDisposable)。工作单元是EF4上下文的包装器。 StructureMap(DI容器)负责组件的生命周期(包括UoW - 也称为上下文)。我为每个HTTP请求创建一个UoW,并在它完成时进行Dispose。我的“服务”调用我的IQueryable存储库上的方法并返回集合(例如,在传递回Controller之前实现查询)。

  

你在哪里做映射?你在控制器中做到了吗?

由你决定。就个人而言,我会创建一个静态的“bootstrapper”类,它有一个方法,例如“Configure”。在Application_Start事件(Global.asax)中调用一次。这项技术被描述为here

祝你好运!