Automapper实现自动映射的实例代码
出于安全考虑,在后台与前台进行数据传输时,往往不会直接传输实体模型,而是使用Dto(Datatransferobject数据传输对象),这样在后台往前台传递数据时可以省略不必要的信息,只保留必要的信息,大大增强数据安全性。
下面给出两个相互对应的关系模型User、UserDto
publicclassUser
{
privateconstintNameMaxLength=20;
privateconstintPassWordMaxLength=16;
[Key]
publiclongId{get;}
[MaxLength(NameMaxLength)]
publicstringName{get;set;}
[MaxLength(PassWordMaxLength)]
[DataType(DataType.Password)]
publicstringPassWord{get;set;}
}
publicclassUserDto
{
privateconstintNameMaxLength=20;
privateconstintPassWordMaxLength=16;
[MaxLength(NameMaxLength)]
publicstringName{get;set;}
[MaxLength(PassWordMaxLength)]
publicstringPassWord{get;set;}
}
这里将Id定义为自增长主键,在注册页面,这个Id应不可见,这个时候使用Dto的好处就体现出来了,这个时候,在存入数据库时会涉及到UserDto往User的类型转换,按照之前的经验,肯定可以按照下面这样来写:
user.Name=userDto.Name; user.PassWord=UserDto.PassWord;
这样的转换固然可以,但是如果一个User对象足够复杂,有十几个甚至二十几个属性,这个时候这种写法就会显得十分笨拙。
这个时候我们就可以借助AutoMapper来帮助我们完成UserDto到User的转换了。
首先安装Nuget包
在Tools-NugetPackageManage-PackageManageConsole输入
Install-PackageAutoMapper
安装相应的Nuget包。
根据Github上给出的帮助文档来看,有两种方法可以创建映射,一种是静态的Initalize一种是动态创建。
下面使用两种不同的方法来进行单元测试
publicvoidUsing_Initlalize_Test()
{
UserDtodto=newUserDto
{
Name="Niko",
PassWord="1234",
};
Mapper.Initialize(ctx=>ctx.CreateMap());
Useruser=Mapper.Map(dto);
user.Name.ShouldBe("Niko");
user.PassWord.ShouldBe("1234");
user.Id.ToString().ShouldBe("0");
}
publicvoidUsing_MapperConfiguration_Test()
{
varconfig=newMapperConfiguration(ctx=>ctx.CreateMap());
varmapper=config.CreateMapper();
//varmapper=newMapper(config);
UserDtodto=newUserDto
{
Name="Niko",
PassWord="1234",
};
Useruser=mapper.Map(dto);
//Useruser=Mapper.Map(dto);
user.Name.ShouldBe("Niko");
user.PassWord.ShouldBe("1234");
user.Id.ToString().ShouldBe("0");
}
这里使用到Shouldly断言框架,具体用法参考官方文档。
写完规则之后通常会调用AssertConfigurationIsValid方法,检查规则是否完整
Mapper.AssertConfigurationIsValid();
两种方法,单元测试均通过。这样的话,借助Automapper处理复杂的对象映射,将大大简化我们的代码量。
为了更加便捷地使用AutoMappper,对AutoMapper进行扩展
publicstaticclassAutoMapperExtension
{
///
///对象到对象
///
///
///
///
publicstaticTMapTo(thisobjectobj)
{
if(obj==null)returndefault(T);
Mapper.Initialize(ctx=>ctx.CreateMap(obj.GetType(),typeof(T)));
returnMapper.Map(obj);
}
///
///集合到集合
///
///
///
///
publicstaticListMapTo(thisIEnumerableobj)
{
if(obj==null)thrownewArgumentNullException();
Mapper.Initialize(ctx=>ctx.CreateMap(obj.GetType(),typeof(T)));
returnMapper.Map>(obj);
}
}
使用上面的方法进行单元测试:
publicvoidtestme()
{
UserDtodto=newUserDto
{
Name="Niko",
PassWord="1234",
};
Useruser=dto.MapTo();
user.Name.ShouldBe("Niko");
user.PassWord.ShouldBe("1234");
user.Id.ToString().ShouldBe("0");
}
总结
以上所述是小编给大家介绍的Automapper实现自动映射的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!