前段时候做个小项目用到了autoMapper(参考了NOP里的用法),感觉还行,用起来挺方便的。首先复杂的东西我就不说了,至于详细的教程我也就不写了,比较园子里有很多这样的文章,我就分享下,在项目中实际的用法。毕竟我们自己练习和项目中使用还是有些差别的。
一、创建AutoMapper转换规则
首先代码如下:
//===============================执行AutoMapper开始==================================================== var startUpTaskTypes = typeFinder.FindClassesOfType<IStartupTask>(); var startUpTasks = new List<IStartupTask>(); foreach (var startUpTaskType in startUpTaskTypes) startUpTasks.Add((IStartupTask)Activator.CreateInstance(startUpTaskType)); //sort startUpTasks = startUpTasks.AsQueryable().OrderBy(st => st.Order).ToList(); foreach (var startUpTask in startUpTasks) startUpTask.Execute(); //===============================执行AutoMapper结束==================================================== builder.Update(container);
代码分析如下:
1、在网站初始化的时候,加载所有web网站中所有程序集。
2、找到所有实现了IStartupTask接口的实现类,并创建
3、执行所有IStartupTask接口的实现类的Execute()方法,该方法执行并创建AutoMapper映射关系
IStartupTask实现类也很简单,这里我没有用到复杂的转换规则,如果有复杂的规则大家可以参考其他文章,代码如下:
public class AutoMapperStartupTask:IStartupTask { public void Execute() { Mapper.CreateMap<AnnexSetting, AnnexSettingDto>(); Mapper.CreateMap<AnnexSettingDto, AnnexSetting>(); Mapper.CreateMap<BaseMpSet, BaseMpSetDto>(); Mapper.CreateMap<BaseMpSetDto, BaseMpSet>(); } }
上面我们就完成了两个Model模型和DTO实体之间做的转换规则,如果有其他的模型和DTO实体的转换规则可以在这里添加。注:这些工作都是网站初始化的时候一次加载执行的。
二、执行AutoMapper转换规则
首先还是看代码:
public static class MappingExtensions { public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination) { // return Mapper.DynamicMap<TSource, TDestination>(source); return Mapper.Map(source, destination); } public static TDestination MapTo<TSource, TDestination>(this TSource source) { return Mapper.Map<TSource, TDestination>(source); } #region 设置 /// <summary> /// 附件设置 /// </summary> /// <param name="model"></param> /// <param name="destination"></param> /// <returns></returns> public static AnnexSetting ToEntity(this AnnexSettingDto model, AnnexSetting destination) { return model.MapTo(destination); } public static AnnexSettingDto ToModel(this AnnexSetting entity) { return entity.MapTo<AnnexSetting, AnnexSettingDto>(); } #endregion }
上面的代码其实是执行Mapper的标准写法,我们在使用的时候可以这样写:
1 public ActionResult Annex() 2 { 3 //这里其实从数据库加载出来的模型类 4 var annexSettings = _settingService.LoadSetting<AnnexSetting>(); 5 6 //将模型类转换为dto类 7 var model = annexSettings.ToModel(); 8 //将dto对象传输到页面上 9 return View(model); 10 }
从上面第七行代码看出,我们只需调用这个方法即可实现转换,就这么简单啦。。。