我已经使用AutoMapper几个月了,但是现在我已经遇到了一些绊脚石。我需要(或认为我需要)的是双向映射。这适用于我从数据库加载项目以在屏幕上播放(域对象 - >视图模型)以及当用户对所述项目进行更改并将其映射回我的域对象时(视图模型 - >域对象) )。
据我所知,我可以在我的个人资料中创建一个映射来处理双向映射,但我正在阅读here,不需要双向映射。许多人表示,这样做是对不解决更大问题的回应(可能是什么)。
我只是想知道为什么这是代码味道?
答案 0 :(得分:11)
当我还是一名初级开发者时,我参与了一个大型项目,基本上就是你所描述的。我们没有使用automapper,但我们创建了封装域对象的视图模型,这基本上意味着您从视图直接更改到域对象。只需坚持您的更改并预先确定它们就在您希望的位置(在数据库中)。该应用程序应该在四年前发布,但它们仍在苦苦挣扎。
为什么这是一种气味?那么你正在失去对你为什么要改变东西的任何意图。随着应用程序的增长和变得越来越复杂,意图就变得非常重要。很难在您的域中强制执行新规则,因为很难确切地确定哪些操作在您的域上有效。如果您使域模型可自动映射,那么它也非常anemic。
正如吉米指出的那样,您希望根据域的要求对域进行建模,而不是根据automapper的要求。如果automapper直接在您的模型上工作,您将不得不进行调整,例如将属性设置器公开,尽管从域建模的角度来看这可能不是一个好主意。
我认为更大的问题是可以直接从视图模型自动化的域模型不会以令人满意的方式传达意图或封装。如果您正在创建一个小型应用程序,那么活动记录/数据集样式体系结构可能不是一件坏事,但如果解决方案规模较大或复杂,则比从viewmodel映射到域更大的问题。
在我正在处理的当前应用程序中,我们使用automapper从域映射到dto,从dto映射到viewmodels。当要保留某些内容时,我们将viewmodel上的操作转换为针对域执行的显式命令。我永远不会在任何大型应用程序(瘦客户端或胖客户端)中推荐三层架构。