我一直在研究一种新的MVC应用程序,该应用程序利用EF4,POCO域对象和存储库< - >服务层。
我看到很多关于使用AutoMapper将EF4类映射到View模型的DTO的讨论。我的印象是,这是为了摆脱紧密绑定的EF4类。所以我的问题是因为我正在使用POCO类,我不能只使用View Models中的那些吗?或者是否仍然需要AutoMapper?
答案 0 :(得分:13)
争论的焦点是你的“POCO”是你的域模型,你的View不应该关注域模型。
以这种方式思考 - 数据验证,如果你想要数据注释,你必须将它们放在你的POCO上 - 但输入验证(这个字段是必需的等)并不是真正的域关注,它是一个UI关注 - 因此使用ViewModels进行数据注释和AutoMapper。
当然,它不是切割和干燥,这是一个偏好的问题。
我也使用MVC / EF4 / POCO / AutoMapper / Service Layer,我从不绑定到POCO - 我总是使用每个View的ViewModel。
这样,您就具有良好的一致性:
**编辑 - 回应评论:**
您的存储库是否会返回IQueryable?如果是这样,你如何处理上下文?我的意思是你的存储库是否实现了IDisposable,然后你将它们丢弃在控制器中?
是 - 我的存储库返回IQueryable<T>
,其中T是聚合根。我的存储库通过了一个工作单元(它实现了IDisposable)。工作单元是EF4上下文的包装器。 StructureMap(DI容器)负责组件的生命周期(包括UoW - 也称为上下文)。我为每个HTTP请求创建一个UoW,并在它完成时进行Dispose。我的“服务”调用我的IQueryable存储库上的方法并返回集合(例如,在传递回Controller之前实现查询)。
你在哪里做映射?你在控制器中做到了吗?
由你决定。就个人而言,我会创建一个静态的“bootstrapper”类,它有一个方法,例如“Configure”。在Application_Start事件(Global.asax)中调用一次。这项技术被描述为here。
祝你好运!