实体框架4 POCO和AutoMapper

Sam*_*Sam 4 asp.net-mvc poco automapper entity-framework-4

我一直致力于使用EF4,POCO域对象和存储库< - >服务层的新MVC应用程序.

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

RPM*_*984 13

争论的焦点是你的"POCO"是你的领域模型,你的View不应该关注领域模型.

这样考虑 - 数据验证,如果你想要数据注释,你必须将它们放在你的POCO上 - 但是输入验证(这个字段是必需的等)并不是真正的域关注点,它是一个UI问题 - 因此ViewModel用于数据注释和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)中调用一次.这里描述了这种技术.

祝好运!

  • 这个响应是一个很好的例子,说明为什么StackOverflow是获得良好解释和答案的最佳网站.我需要相同的信息,感谢RPM1984!:) (5认同)