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); } /// ///集合到集合 /// ////// /// publicstaticList MapTo (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实现自动映射的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!