2011-02-24 80 views
4

我一直在研究一个新的MVC应用程序,该应用程序使用EF4,POCO域对象和存储库< - >服务层。实体框架4 POCO's和AutoMapper

我看到很多关于使用AutoMapper将EF4类映射到View Models的DTO的讨论。我的印象是,这是为了摆脱EF4课程的束缚。所以我的问题是,因为我使用POCO类,我不能只使用视图模型中的那些?还是仍然需要AutoMapper?

回答

13

论点是你的“POCO's”是你的域模型,你的View不应该关注Domain Models。

想想这样 - 数据验证,如果你想要数据注释,你将不得不把它们放在你的POCO的 - 但输入验证(这个字段是必需的等)不是一个真正的领域问题,它是一个UI关注 - 因此使用ViewModels进行数据注释和AutoMapper。

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

我也使用MVC/EF4/POCO/AutoMapper /服务层,我永远不会绑定到POCO的 - 我总是使用每个视图的ViewModel。

这样一来,你有一致性的良好水平:

  • 所有视图的有一个视图模型
  • POCO的都没有,但业务/域逻辑
  • 视图模型的具有基本的输入验证
  • 他们是然后映射到POCO,它调用域/业务验证

**编辑 - 为了响应com ments:**

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

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

你在哪里做你的地图?你在控制器中做到了吗?

由您决定。就个人而言,我会创建一个静态的“引导程序”类,它有一个单一的方法,例如“配置”。在您的Application_Start事件(Global.asax)中调用一次。这种技术描述here

祝你好运!

+0

@ RPM1984 - 感谢您的解释?我还有其他几个q给你。 1)你的存储库是否返回IQueryable? 2)如果是这样,你如何处理上下文?我的意思是你的存储库是否实现了IDisposable,然后你将它们丢弃在控制器中?感谢您所有的帮助!! – Sam 2011-02-24 06:31:21

+0

@ RPM1984 - 你在哪里做你的地图?你在控制器中做到了吗? – Sam 2011-02-24 06:48:02

+1

@Sam Striano - 查看我的编辑 – RPM1984 2011-02-24 08:05:11