实体框架4 POCO和AutoMapper

4

我一直在开发一个新的MVC应用程序,它使用EF4、POCO领域对象和存储库<-->服务层。

我看到很多人谈论使用AutoMapper将EF4类映射到DTO以供视图模型使用。我原本认为这是为了摆脱紧密绑定的EF4类。所以我的问题是,既然我正在使用POCO类,那我不能直接在视图模型中使用它们吗?还是说仍然需要AutoMapper?

1个回答

13
这里的论点是你的“POCO”是你的领域模型,而你的视图不应该关注领域模型。
可以这样想——数据验证,如果你想使用数据注释,那么你必须将它们放在你的POCO上,但是输入验证(此字段为必填字段等)并不是一个领域问题,而是一个UI问题,因此使用ViewModels进行数据注释和AutoMapper映射。
当然,这并不是非黑即白的问题,这是一个偏好的问题。
我也使用MVC/EF4/POCO/AutoMapper/Service Layer,并且从不绑定到POCO,我总是为每个View使用一个ViewModel。
这样,你就有了一个很好的一致性水平:
  • 所有View都有一个ViewModel
  • POCO只有业务/领域逻辑
  • ViewModel具有基本的输入验证
  • 然后将它们映射到POCO中,调用领域/业务验证
**编辑-回应评论:**

你的Repositories是否返回IQueryable?如果是,你如何处理上下文?我的意思是你的Repositories实现IDisposable然后在控制器中处理它们吗?

是的 - 我的仓储返回 IQueryable<T>,其中 T 是聚合根。我的仓储接收一个工作单元(实现了 IDisposable)。工作单元是 EF4 上下文的包装器。StructureMap(DI 容器)负责组件的生命周期(包括 UoW,也就是上下文)。我为每个 HTTP 请求创建一个 UoW 实例,并在完成后进行处理。我的“服务”调用 IQueryable 仓储上的方法并返回集合(例如,在传递回控制器之前将查询材料化)。
“你在哪里进行映射?你是在控制器中进行吗?”
由你决定。个人而言,我会创建一个静态的“引导程序”类,该类有一个单一的方法,例如“Configure”。在 Application_Start 事件(Global.asax)中调用此方法一次。这种技术在这里描述过。祝你好运!

@RPM1984 - 你在哪里进行映射?你是在控制器中进行吗? - Sam
5
这篇回答很好地说明了为什么StackOverflow是提供良好解释和答案的最佳网站。我自己也需要相同的信息,感谢RPM1984! :) - Yngve B-Nilsen
1
@Yngve B Nilsen - 很高兴我能帮到你! :) - RPM1984
你的例子真是太棒了,我正需要这个! - Manaf Abu.Rous
不要再@see我了 - 我不会跟着你。你所说的“显式关系加载”是什么意思?你是指“急切加载”吗?如果是这样,在存储库中已经处理了这个问题。我传递一些bool标志,例如bool loadPosts,然后检查并相应地执行.Include - RPM1984
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接