什么是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 }