OOM AutoMapper的简单实用
一.前言:
OOM顾名思义,Object-Object-Mapping实体间相互转换,AutoMapper也是个老生常谈了,其意义在于帮助你无需手动的转换简单而又麻烦的实体间关系,比如ViewModel和entity的转换,SearchModel和Entity的转换
先来思考一个问题:一个项目分多层架构,如显示层、业务逻辑层、服务层、数据访问层。层与层访问需要数据载体,也就是类。如果多层通用一个类,一则会暴露出每层的字段,二者会使类字段很多,而且会出现很多冗余字段,这种方式是不可取的;如果每层都使用不同的类,则层与层调用时,一个字段一个字段的赋值又会很麻烦。针对第二种情况,可以使用AutoMapper来帮助我们实现类字段的赋值及转换。
AutoMapper是一个对象映射器,它可以将一个一种类型的对象转换为另一种类型的对象。AutoMapper提供了映射规则及操作方法,使我们不用过多配置就可以映射两个类。
二.demo:
先来两个类:一个是业务层的类,一个是数据访问层的类:
1.业务层的类:UserViewModel.cs
public class UserViewModel { /// <summary> /// 用户ID /// </summary> public string UserId { get; set; } /// <summary> /// 账号 /// </summary> public string Account { get; set; } /// <summary> /// 密码 /// </summary> public string Password { get; set; } }
2.数据访问层的类:UserEntity.cs
public class UserEntity { /// <summary> /// 用户ID /// </summary> [Key] public string UserId { get; set; } /// <summary> /// 账号 /// </summary> public string Account { get; set; } /// <summary> /// 密码 /// </summary> public string Password { get; set; } }
使用AutoMapper.dll v1.0版本
1.静态映射:
静态映射配置:
public class BootAutoMapper
{
public static void Register()
{
Mapper.Initialize(x =>
{
x.AddProfile<AutoMapperConfigProfile>();
});
}
}
public class AutoMapperConfigProfile : Profile
{
protected override void Configure()
{
CreateMap<UserEntity, UserViewModel>();
CreateMap<UserViewModel, UserEntity>();
}
}
静态映射使用:
UserViewModel model= Mapper.Map<UserEntity, UserViewModel>(entity);
2.动态映射:(不需要配置)
UserViewModel model= Mapper.DynamicMap<UserEntity, UserViewModel>(entity);
三.经验之谈:
动态映射会出事,此话怎讲呢,来听听我的案例:
开发了一套xx系统,由于对此内裤熟悉不深入,掉进坑了。系统在不指定的时间就崩溃了,排查了很久终于找到原因了,是由于系统中使用的是automapper的动态映射造成的。超过指定的时间应用程序池将回收,如果用户刚好在此时间上访问系统,就造成了系统无法访问,因为对象被iis回收了。
在高版本上动态映射已经被抛弃了。
四.错误现象:
错误如下图,实体映射转换时,出现了类型错误
五.解决方案:
1.iis的应用程序池设置为回收时间为0,代表不回收,如下图:
2.将动态映射修改为静态映射即可;