配色: 字号:
五步掌握OOM框架AutoMapper基本使用
2016-12-09 | 阅:  转:  |  分享 
  
五步掌握OOM框架AutoMapper基本使用

写在前面

OOM顾名思义,Object-Object-Mapping实体间相互转换,AutoMapper也是个老生常谈了,其意义在于帮助你无需手动的转换简单而又麻烦的实体间关系,比如ViewModel和entity的转换,SearchModel和Entity的转换,我这篇分享的意义在于,网上大多数的分享都是几年前的,很多方法已经被废弃,到了编译器里会告诉你该方法已经过时,废弃的,不建议使用的,比如Mapper.CreateMap等方法,当然老司机大多数直接就去github看文档了,或者google一下就了解了,但是中文资料关于方法废弃后,并没有什么说明了。本篇的五个实例可以帮你解决常见的基本问题.







预备

首先我们预备一些ViewModel和TModel。ViewModel就是你和用户交互的实体。TModel就是你与数据库打交道的实体。



实体展示如下:



TModel有如下三个简单的实体,他们有独立的实体,也有一对多的实体。



publicclassTAddress

{

publicstringCountry{get;set;}

publicstringCity{get;set;}

publicstringStreet{get;set;}

publicstringPostCode{get;set;}

publicstringCreateTime{get;set;}

publicintCreateUserId{get;set;}

}

复制代码

publicclassTAuthor

{



publicstringName{get;set;}

publicstringDescription{get;set;}

publicListContactInfo{get;set;}



}

publicclassTContactInfo

{

publicintId{get;set;}

publicstringEmail{get;set;}

publicstringBlog{get;set;}

publicstringTwitter{get;set;}

}

复制代码

ViewModel如下三个:



复制代码

publicclassVM_Address

{

publicstringCountry{get;set;}

publicstringCity{get;set;}



publicstringCity2{get;set;}

}

publicclassVM_Author

{

publicstringName{get;set;}

publicstringDescription{get;set;}

publicListContactInfo{get;set;}

}



publicclassVM_ContactInfo

{

publicintId{get;set;}

publicstringEmail{get;set;}

publicstringBlog{get;set;}

publicstringTwitter{get;set;}

}

复制代码





单个实体转换

单个实体转换的时候,在属性字段名称完全匹配的情况下,你只需指定两个实体间的转换规则,指定source源实体和destination目标实体。那么你应该参照如下实例:



复制代码

VM_Addressdto=newVM_Address

{

Country="China",

City="Beijing"

};



Mapper.Initialize(m=>m.CreateMap());

TAddressaddress=Mapper.Map(dto);

复制代码

请注意在AutoMapper5.x当中,Initialize来初始化你的规则是首选的。



在你指定转换规则后,请使用Map方法,进行转换并输出你的目标实体。还有第一个参数代表SourceModel,第二个参数是DestinationModel.



单个实体不同名属性转换

当你需要对不同名称的字段来进行映射的时候,请注意使用ForMember方法,第一个参数需要你制定所需特殊配置的目标字段,第二个参数你则需要制定你对该字段属性的操作,我选择了它提供的MapFrom方法,意义在于告诉AutoMapper,我需要讲目标实体的City来源指定为源实体的City2属性值。



复制代码

VM_Addressdto=newVM_Address

{

Country="China",

City2="Beijing"

};



Mapper.Initialize(m=>m.CreateMap().ForMember(x=>x.City,opt=>opt.MapFrom(o=>o.City2)));

TAddressaddress=Mapper.Map(dto);

复制代码





集合转换

在集合间转换的时候,你不需要配置目标List与源List对象中的匹配,而只需要配置你泛型对象的映射匹配关系。



TAddressaddress=newTAddress{Country="China",City="Beijing"};

TAddressaddress2=newTAddress(){Country="USA",City="NewYork"};

ListaddressList=newList(){address2,address};



Mapper.Initialize(m=>m.CreateMap());//这里仅需配置实体间的转换,而不是实体集合的转换

Listres=Mapper.Map,List>(addressList);





实体包含不同类型属性转换(忽略属性)

在实体包含不同类型属性的时候,比如TModel1中包含了一个List,而你的ViewModel1中包含了一个List.这个时候你可以选择忽略这个属性



复制代码

varcontacts=newList(){newTContactInfo()

{Blog="myblog",Email="ws@qq.com"},newTContactInfo(){Blog="myblog",Email="ll@qq.com"}};

TAuthorauthor=newTAuthor(){Description="描述",Name="吴双",ContactInfo=contacts};



Mapper.Initialize(m=>{m.CreateMap().ForMember(x=>x.ContactInfo,opt=>opt.Ignore());});

VM_Authordto=Mapper.Map(author);



//这里的Ignore代表配置ContractInfo该属性的操作为忽略Ignore,映射时将忽略该属性由于List()和List()是不同类型,所以需要配置忽略或者是特殊映射,特殊映射例子看下方

复制代码





实体包含不同类型属性转换(指定属性Mapfrom)

当然你需要这个属性的时候,你可以不忽略他,而是使用MapFrom来进行特殊的指定,并且在类型不相同的时候,你要指定你两个类型间的映射匹配关系。正如下面实例中的



m.CreateMap();和

m.CreateMap().ForMember(x=>x.ContactInfo,opt=>opt.MapFrom(o=>o.ContactInfo));

复制代码

varcontacts=newList()

{

newTContactInfo(){Blog="myblog",Email="ws@qq.com"},

newTContactInfo(){Blog="myblog",Email="ll@qq.com"}

};

TAuthorauthor=newTAuthor(){Description="描述",Name="吴双",ContactInfo=contacts};



Mapper.Initialize(m=>

{

m.CreateMap();//注意内部不同类型实体转换时必要的

m.CreateMap().ForMember(x=>x.ContactInfo,opt=>opt.MapFrom(o=>o.ContactInfo));//注意制定MapFrom是必要的

});



VM_Authordto=Mapper.Map(author);

献花(0)
+1
(本文系thedust79首藏)