asp.net-mvc – 在图层之间复制模型

遍历图层时,执行右侧>左侧分配作为填充模型的方法非常繁琐.例如:
employeeViewModel.FirstName = employeeModel.FirstName;
employeeViewModel.LastName = employeeModel.LastName;
...

因此,我们可以构建一个使用反射来复制模型的ModelCopier:

var employeeViewModel = ModelCopier.Copy<EmployeeViewModel>(employeeModel);

这种技术大大简化了任务.但是,有一些事情令人非常不安:

>我们实际上已经失去了跟踪源和目标对象上属性的用法的能力.例如,查找FirstName属性的使用(在Resharper中)不会显示ModelCopier案例.
>如果我们更改源类或目标类的属性名称,我们可能会无意中导致运行时异常,因为我们可能没有意识到我们需要更新源类和目标类.

在光谱的一端,我们可以使用非常容易的反射,但是以可维护性为代价.光谱的另一端是非常繁琐但非常可维护的.

反射(简单和危险)< ----->直接分配(繁琐且可维护)

我很好奇是否有人发现了一种折衷方案,它提供了易于使用反射进行复制并具有直接分配的可维护性.

我们接受的一个解决方案是构建一个插件,该插件将生成扩展方法,以处理每种情况的属性分配.换句话说,构建一个可以处理繁琐部分的工具.

编辑:

请理解,此问题与使用哪种映射工具无关.我试图理解我们如何享受基于反射的映射的好处,同时还享受直接赋值(或属性映射契约)提供的可维护性的好处.

解决方法

可能编译器不会在整个代码中进行必要的测试……这就是单元测试的用武之地.
如果您已经为不同层中的类之间的转换定义了测试(是的,您需要执行所有可能的转换,否则您如何确保您的反射方法在生产中的每种情况都能正常工作?),运行测试将告诉开发人员更改了属性名称,该解决方案不再通过所有测试.
每次要签入源代码时,都应该运行每个测试(单元测试,而不是集成测试)…这不应该是几个月的编码:))

因此,我真的投票使用反射方法,用一勺单位测试方法辛辣.

相关文章

引言 本文从Linux小白的视角, 在CentOS 7.x服务器上搭建一个...
引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要...
一. 宏观概念 ASP.NET Core Middleware是在应用程序处理管道...
背景 在.Net和C#中运行异步代码相当简单,因为我们有时候需要...
HTTP基本认证 在HTTP中,HTTP基本认证(Basic Authenticatio...
1.Linq 执行多列排序 OrderBy的意义是按照指定顺序排序,连续...