.NetCore学习笔记:四、AutoMapper对象映射
程序员文章站
2022-06-05 16:59:47
什么是AutoMapper?AutoMapper是一个简单的小型库,用于解决一个看似复杂的问题 - 摆脱将一个对象映射到另一个对象的代码。这种类型的代码是相当沉闷和无聊的写,所以为什么不发明一个工具来为我们做? 我们来看看在.netcore3.1中怎样使用AutoMapper9.0。 Profile ......
什么是automapper?
automapper是一个简单的小型库,用于解决一个看似复杂的问题 - 摆脱将一个对象映射到另一个对象的代码。这种类型的代码是相当沉闷和无聊的写,所以为什么不发明一个工具来为我们做?
我们来看看在.netcore3.1中怎样使用automapper9.0。
1 public class basicprofile : profile, iprofile 2 { 3 public basicprofile() 4 { 5 createmap<testdto, test>(); 6 createmap<test, testdto>(); 7 } 8 }
profile提供了一个命名的映射类,所有继承自profile类的子类都是一个映射集合。这里我创建了一个basicprofile继承profile类。
createmap创建映射规则。
iprofile创建影射类的约束,表示继承自该接口的类为映射集合。
由于automapper9.0中取消了自动创建影射规则的方法这里我们需要自己写一个:
1 public static class servicecollectionextensions 2 { 3 /// <summary> 4 /// 自动创建映射 5 /// </summary> 6 /// <param name="services"></param> 7 public static void addautomapper(this iservicecollection services) 8 { 9 var allprofile = directory.getfiles(appdomain.currentdomain.basedirectory, "*.dll").select(assembly.loadfrom) 10 .selectmany(y => y.definedtypes) 11 .where(p => p.getinterfaces().contains(typeof(iprofile))) 12 .toarray(); 13 services.addautomapper(allprofile); 14 } 15 }
添加到configureservices:
1 public void configureservices(iservicecollection services) 2 { 3 //自动创建映射 4 services.addautomapper(); 5 }
这样automapper就配置完成,但为了方便调用,我们继续写几个扩展:
1 public static class automapperapplicationbuilderextensions 2 { 3 private static iserviceprovider _serviceprovider; 4 public static void usestateautomapper(this iapplicationbuilder applicationbuilder) 5 { 6 _serviceprovider = applicationbuilder.applicationservices; 7 } 8 9 public static tdestination map<tdestination>(object source) 10 { 11 var mapper = _serviceprovider.getrequiredservice<imapper>(); 12 return mapper.map<tdestination>(source); 13 } 14 15 public static tdestination map<tsource, tdestination>(tsource source) 16 { 17 var mapper = _serviceprovider.getrequiredservice<imapper>(); 18 19 return mapper.map<tsource, tdestination>(source); 20 } 21 22 public static tdestination mapto<tsource, tdestination>(this tsource source) 23 { 24 var mapper = _serviceprovider.getrequiredservice<imapper>(); 25 return mapper.map<tsource, tdestination>(source); 26 } 27 28 public static tdestination mapto<tdestination>(this object source) 29 { 30 var mapper = _serviceprovider.getrequiredservice<imapper>(); 31 return mapper.map<tdestination>(source); 32 } 33 34 public static list<tdestination> maptolist<tdestination>(this ienumerable source) 35 { 36 var mapper = _serviceprovider.getrequiredservice<imapper>(); 37 return mapper.map<list<tdestination>>(source); 38 } 39 40 public static list<tdestination> maptolist<tsource, tdestination>(this ienumerable<tsource> source) 41 { 42 var mapper = _serviceprovider.getrequiredservice<imapper>(); 43 return mapper.map<list<tdestination>>(source); 44 } 45 }
添加到configure:
1 public void configure(iapplicationbuilder app, iwebhostenvironment env) 2 { 3 app.usestateautomapper(); 4 }