Automapper实现自动映射的实例代码
出于安全考虑,在后台与前台进行数据传输时,往往不会直接传输实体模型,而是使用dto(data transfer object 数据传输对象),这样在后台往前台传递数据时可以省略不必要的信息,只保留必要的信息,大大增强数据安全性。
下面给出两个相互对应的关系模型user、userdto
public class user { private const int namemaxlength = 20; private const int passwordmaxlength = 16; [key] public long id { get; } [maxlength(namemaxlength)] public string name { get; set; } [maxlength(passwordmaxlength)] [datatype(datatype.password)] public string password { get; set; } } public class userdto { private const int namemaxlength = 20; private const int passwordmaxlength = 16; [maxlength(namemaxlength)] public string name { get; set; } [maxlength(passwordmaxlength)] public string password { get; set; } }
这里将 id 定义为自增长主键,在注册页面,这个 id 应不可见,这个时候使用dto的好处就体现出来了,这个时候,在存入数据库时会涉及到 userdto 往 user 的类型转换,按照之前的经验,肯定可以按照下面这样来写:
user.name=userdto.name; user.password=userdto.password;
这样的转换固然可以,但是如果一个 user 对象足够复杂,有十几个甚至二十几个属性,这个时候这种写法就会显得十分笨拙。
这个时候我们就可以借助automapper来帮助我们完成 userdto 到 user 的转换了。
首先安装nuget包
在 tools - nuget package manage - package manage console 输入
install-package automapper
安装相应的nuget包。
根据 github 上给出的帮助文档来看,有两种方法可以创建映射,一种是静态的 initalize 一种是动态创建。
下面使用两种不同的方法来进行单元测试
public void using_initlalize_test() { userdto dto = new userdto { name = "niko", password = "1234", }; mapper.initialize(ctx => ctx.createmap<userdto, user>()); user user = mapper.map<userdto, user>(dto); user.name.shouldbe("niko"); user.password.shouldbe("1234"); user.id.tostring().shouldbe("0"); } public void using_mapperconfiguration_test() { var config = new mapperconfiguration(ctx => ctx.createmap<userdto, user>()); var mapper = config.createmapper(); // var mapper = new mapper(config); userdto dto = new userdto { name = "niko", password = "1234", }; user user = mapper.map<user>(dto); //user user = mapper.map<user>(dto); user.name.shouldbe("niko"); user.password.shouldbe("1234"); user.id.tostring().shouldbe("0"); }
这里使用到 shouldly 断言框架,具体用法参考官方文档。
写完规则之后 通常会调用 assertconfigurationisvalid 方法,检查规则是否完整
mapper.assertconfigurationisvalid();
两种方法,单元测试均通过。这样的话,借助 automapper 处理复杂的对象映射,将大大简化我们的代码量。
为了更加便捷地使用 automappper ,对automapper进行扩展
public static class automapperextension { /// <summary> /// 对象到对象 /// </summary> /// <typeparam name="t"></typeparam> /// <param name="obj"></param> /// <returns></returns> public static t mapto<t>(this object obj) { if (obj == null) return default(t); mapper.initialize(ctx=>ctx.createmap(obj.gettype(),typeof(t))); return mapper.map<t>(obj); } /// <summary> /// 集合到集合 /// </summary> /// <typeparam name="t"></typeparam> /// <param name="obj"></param> /// <returns></returns> public static list<t> mapto<t>(this ienumerable obj ) { if (obj == null) throw new argumentnullexception(); mapper.initialize(ctx => ctx.createmap ( obj.gettype(), typeof(t))) ; return mapper.map<list<t>>(obj); } }
使用上面的方法进行单元测试:
public void testme() { userdto dto = new userdto { name = "niko", password = "1234", }; user user=dto.mapto<user>(); user.name.shouldbe("niko"); user.password.shouldbe("1234"); user.id.tostring().shouldbe("0"); }
总结
以上所述是小编给大家介绍的automapper实现自动映射的实例代码,希望对大家有所帮助
上一篇: Java中如何比较两个数组中元素是否相同