在 ASP.NET MVC 项目中,我们使用 AutoMapper 从域模型映射到视图模型 - 有时还会在这样做的同时展平层次结构。这就像一个魅力,使我们的视图的渲染逻辑非常精简和简单。
当我们想要从视图模型(或后模型或编辑模型)到域模型的另一种方式时,尤其是在更新对象时,混乱就开始了。我们不能使用自动/双向映射,因为:
- 我们将不得不展开扁平的层次结构
- 域模型上的所有属性都必须是可变的/具有公共设置器
- 来自视图的更改并不总是被映射回域的平面属性,但有时需要调用诸如“
ChangeManagerForEmployee()
”或类似的方法。
这也在 Jimmy Bogards 的文章中有所描述:AutoMapper 中的双向映射案例,但没有详细描述解决方案,只是他们去:
从 EditModel 到 CommandMessages——从松散类型的 EditModel 到强类型的中断消息。单个 EditModel 可能会生成六条消息。
在类似的SO question中, Mark Seeman有一个回答,他提到
我们使用抽象映射器和服务将 PostModel 映射到域对象
但是细节 - 概念和技术实现 - 被遗漏了。
我们现在的想法是:
- 在控制器的操作方法中接收 FormCollection
- 获取原始域模型并将其展平为 viewModelOriginal 和 viewModelUpdated
- 使用将 FormCollection 合并到 viewModelUpdated 中
UpdateModel()
- 使用一些通用的辅助方法来比较 viewModelOriginal 和 viewModelUpdated
- A)像 Jimmy Bogard 那样生成 CommandMessage 或 B)通过属性和方法将差异直接变异到域模型中(可能直接通过 AutoMapper 映射 1-1 属性)
有人可以提供一些示例,说明它们是如何从 FormCollection 通过editmodel/postmodel 到域模型的吗?“CommandMessages”还是“抽象映射器和服务”?