欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.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 }