当前位置: 移动技术网 > IT编程>开发语言>.net > 五步掌握OOM框架AutoMapper基本使用

五步掌握OOM框架AutoMapper基本使用

2017年12月12日  | 移动技术网IT编程  | 我要评论

闪志强,康熙来了20121008,大唐双龙传漫画

写在前面

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

预备

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

实体展示如下:

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

public class taddress
{
 public string country { get; set; }
 public string city { get; set; }
 public string street { get; set; }
 public string postcode { get; set; }
 public string createtime { get; set; }
 public int createuserid { get; set; }
}
public class tauthor
 {
  public string name { get; set; }
  public string description { get; set; }
  public list<tcontactinfo> contactinfo { get; set; }
 }
 public class tcontactinfo
 {
 public int id { get; set; }
 public string email { get; set; }
 public string blog { get; set; }
 public string twitter { get; set; }
 }

viewmodel如下三个:

public class vm_address
 {
 public string country { get; set; }
 public string city { get; set; }
 public string city2 { get; set; }
 }
 public class vm_author
 {
 public string name { get; set; }
 public string description { get; set; }
 public list<vm_contactinfo> contactinfo { get; set; }
 }
 public class vm_contactinfo
 {
 public int id { get; set; }
 public string email { get; set; }
 public string blog { get; set; }
 public string twitter { get; set; }
 }

单个实体转换

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

vm_address dto = new vm_address
  {
  country = "china",
  city = "beijing"
  };
  mapper.initialize(m => m.createmap<vm_address, taddress>());
  taddress address = mapper.map<vm_address, taddress>(dto);

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

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

单个实体不同名属性转换

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

vm_address dto = new vm_address
  {
  country = "china",
  city2 = "beijing"
  };
  mapper.initialize(m => m.createmap<vm_address, taddress>().formember(x => x.city, opt => opt.mapfrom(o => o.city2)));
  taddress address = mapper.map<vm_address, taddress>(dto);

集合转换

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

  taddress address = new taddress { country = "china", city = "beijing" };
  taddress address2 = new taddress() { country = "usa", city = "new york" };
  list<taddress> addresslist = new list<taddress>() { address2, address };
  mapper.initialize(m => m.createmap<taddress, vm_address>());//这里仅需配置实体间的转换,而不是实体集合的转换
  list<vm_address> res = mapper.map<list<taddress>, list<vm_address>>(addresslist);

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

在实体包含不同类型属性的时候,比如tmodel1中包含了一个list<tmodel>,而你的viewmodel1中包含了一个list<viewmodel>.这个时候你可以选择忽略这个属性

 var contacts = new list<tcontactinfo>() { new tcontactinfo() 
          { blog = "myblog", email = "ws@qq.com" }, new tcontactinfo() { blog = "myblog", email = "ll@qq.com" } };
  tauthor author = new tauthor() { description = "描述", name = "吴双", contactinfo = contacts };
  mapper.initialize(m => { m.createmap<tauthor, vm_author>().formember(x => x.contactinfo, opt => opt.ignore()); });
       vm_author dto = mapper.map<tauthor, vm_author>(author);
//这里的ignore代表配置contractinfo该属性的操作 为 忽略ignore,映射时将忽略该属性 由于list<tcontactinfo>()和list<vm_contactinfo>() 是不同类型,所以需要配置忽略或者是特殊映射,特殊映射例子看下方

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

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

m.createmap<tcontactinfo, vm_contactinfo>();和
m.createmap<tauthor, vm_author>().formember(x => x.contactinfo, opt => opt.mapfrom(o => o.contactinfo));

var contacts = new list<tcontactinfo>()
  {
  new tcontactinfo() { blog = "myblog", email = "ws@qq.com" },
  new tcontactinfo() { blog = "myblog", email = "ll@qq.com" }
  };
  tauthor author = new tauthor() { description = "描述", name = "吴双", contactinfo = contacts };
  mapper.initialize(m =>
  {
  m.createmap<tcontactinfo, vm_contactinfo>();//注意 内部不同类型实体转换时必要的
  m.createmap<tauthor, vm_author>().formember(x => x.contactinfo, opt => opt.mapfrom(o => o.contactinfo));//注意 制定mapfrom是必要的
  });
  vm_author dto = mapper.map<tauthor, vm_author>(author);

写在最后

在实体转换中,automapper的必要性和实用性已经被你一览无余。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持移动技术网!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网