AutoMapper 复杂类型间的自己定义相互匹配
2015-10-21 14:16
197 查看
Automapper 功能强大,但是只能识别和匹配简单类型且同名的变量,遇到自定义类型,及复杂类型如果依旧使用最简单的匹配法则就会弹出
【AutoMapper.AutoMapperMappingException】的异常
【之后会讲如何找到关键性错误】
例:转化目标是:
转化来源是:
其中包含着三层的自定义结构,还有List类型
唯一只包含简单类型的事Name,所以能直接使用匹配的是Name
同时如果是这种比较复杂的结构体建议使用configuration来定义mapper规则
如上代码所示,在school这一层就只需要匹配好在school这一层的代码即可,同时,由于teacher,和student中都包含这Name的元素,mapper无法识别,所以同时也要定义好Name=>NameModel的转换规则。
同理,不管层级多复杂,只要在Configure()中定义好Mapper无法识别的类型即可。
在应用时,直接添加Profigure就可以应用自定义的匹配方法了
【AutoMapper.AutoMapperMappingException】的异常
【之后会讲如何找到关键性错误】
例:转化目标是:
namespace SchoolModel { public class schoolModel { public StudentModel students; public TeacherModel Teachers; public List<OtherModel> others; public string one; public string two; } public class OtherModel { public NameModel name; public string one; public string two; } public class TeacherModel { public NameModel name; public string one; public string two; } public class StudentModel { public NameModel name; public string one; public string two; } public class NameModel { public string firstName; public string lastName; } }
转化来源是:
namespace School { public class school { public Student students; public Teacher Teachers; public List<Other> others; public string one; public string two; } public class Other { public Name name; public string one; public string two; } public class Teacher { public Name name; public string one; public string two; } public class Student { public Name name; public string one; public string two; } public class Name { public string firstName; public string lastName; } }
其中包含着三层的自定义结构,还有List类型
唯一只包含简单类型的事Name,所以能直接使用匹配的是Name
同时如果是这种比较复杂的结构体建议使用configuration来定义mapper规则
<pre name="code" class="csharp"> class MapSchool:Profile { protected override void Configure() { var map = Mapper.CreateMap<school, schoolModel>(); map.ForMember(sou => sou.Teachers, dto => dto.MapFrom(src => src.Teachers)) .ForMember(sou => sou.others, dto => dto.MapFrom(src => src.others)) .ForMember(sou => sou.students, dto => dto.MapFrom(src => src.students)); Mapper.CreateMap<Name, NameModel>().ConstructUsing(s => new NameModel { firstName = s.firstName, lastName = s.lastName }); } }
如上代码所示,在school这一层就只需要匹配好在school这一层的代码即可,同时,由于teacher,和student中都包含这Name的元素,mapper无法识别,所以同时也要定义好Name=>NameModel的转换规则。
同理,不管层级多复杂,只要在Configure()中定义好Mapper无法识别的类型即可。
在应用时,直接添加Profigure就可以应用自定义的匹配方法了
public void Main() { school schoolTemp = new school() { // 赋值 }; Mapper.CreateMap<school, schoolModel>(); Mapper.AddProfile(new MapSchool()); schoolModel schoolModelTemp=Mapper.Map<school, schoolModel>(schoolTemp); }
相关文章推荐
- 如何打开一个app
- Android数据库高手秘籍(一)——SQLite命令
- Android复习随笔之SharedPreferences
- iOS 简单的计时器NSTimer
- @Responsebody与@RequestBody @RequestMapping @PathVariable获取请求路径变量
- Android_07_监控应用的状态
- BlockKit的使用
- android内存优化
- Swift - 使用CoreLocation实现定位(经纬度、海拔、速度、距离等)
- Swift - 使用CoreLocation实现定位(经纬度、海拔、速度、距离等)
- ios 开发日记17-单击手势和双击手势共存问题
- android service 详解
- Android_07_开机自启动
- Service和IntentService的区别
- iOS 通知的使用,以及场景(未确定版本)
- 安卓在AndroidManifest.xml文件中设置Android程序的启动界面方法
- android下载apk 断点续传
- Android 秒杀倒计时 解决listview上下滑动计时改变问题
- android自定义控件之禁止ListView滚动
- iOS 静态库中使用宏定义区分iPhone模拟器与真机---备用