Pag*_*age 8 architecture asp.net-mvc automapper asp.net-mvc-2
遍历图层时,执行right-> left赋值作为填充模型的方法非常繁琐.例如:
employeeViewModel.FirstName = employeeModel.FirstName;
employeeViewModel.LastName = employeeModel.LastName;
...
Run Code Online (Sandbox Code Playgroud)
因此,我们可以构建一个使用反射来复制模型的ModelCopier:
var employeeViewModel = ModelCopier.Copy<EmployeeViewModel>(employeeModel);
Run Code Online (Sandbox Code Playgroud)
这种技术大大简化了任务.但是,有一些事情令人非常不安:
在光谱的一端,我们可以使用非常容易的反射,但是以可维护性为代价.频谱的另一端是非常繁琐但非常可维护的.
反思(轻松和危险)<----->直接分配(繁琐且可维护)
我很好奇是否有人发现了一种折衷方案,它提供了易于使用反射进行复制并具有直接赋值的可维护性.
我们接受的一个解决方案是构建一个插件,该插件将生成扩展方法,以处理每种情况的属性分配.换句话说,构建一个可以处理繁琐部分的工具.
编辑:
请理解,此问题与使用哪种映射工具无关.我试图理解我们如何享受基于反射的映射的好处,同时还享受直接赋值(或属性映射契约)提供的可维护性的好处.
djd*_*d87 10
说真的,使用AutoMapper.它允许您设置从一种类型到另一种类型的转换.对属性名称的任何更改都将破坏自动化程序的配置,反射不会:
Mapper.CreateMap<SiteDto, SiteModel>();
Mapper.CreateMap<SiteModel, SiteDto>();
Run Code Online (Sandbox Code Playgroud)
然后要映射到和来,您只需执行以下操作:
SiteDto dto = Mapper.Map<SiteModel, SiteDto>(targetModel);
SiteModel model = Mapper.Map<SiteDto, SiteModel>(targetDto);
Run Code Online (Sandbox Code Playgroud)
编译器可能不会对整个代码进行必要的测试......这就是单元测试的用武之地。如果您已经为不同层中的类之间的转换定义了一个测试(是的,您需要执行的所有可能的转换,否则您如何确保您的反射方法在生产中适用于每种情况?),只需运行测试将告诉更改属性名称的开发人员,该解决方案不再通过所有测试。每次您想要签入源代码时,您都应该运行每个测试(单元测试,而不是集成测试)......这不应该是几个月的编码:))
所以我真的投票支持使用反射方法,辛辣的单元测试方法。
归档时间: |
|
查看次数: |
930 次 |
最近记录: |