1、介绍
用于将实体映射到彼此的强大的可定制工具。实体可以是纯对象,DataReaders,SQL命令以及任何您需要的。该工具通过Emit库生成运行时代码。处理DTO对象,数据访问层等都是有用的。
优点:快,使用方便,灵活;
缺点:11年就不在维护……
Emit Mapper可以自动转换以下类型:
- 任何使用ToString()方法进行字符串处理。
- 使用System.Convert类的基本类型。
- Nullable类型对值类型,反之亦然。
- 枚举为其底层类型,反之亦然。
- 枚举到字符串,反之亦然。
- 不同类型的集合(数组,ArrayList,List <>,IEnumerable)
- 类到结构,反之亦然。
- 具有复杂嵌套成员的复杂类型使用具有浅或深对应的递归映射。
2、网址
官网源代码
3、使用
通过控制台
PM> Install-Package EmitMapper
或者:
4、使用步骤
默认的映射配置器能自动转换以下几种类型:
- 任何类型到string类型使用ToString()方法;
- 可以使用System.Convert类转换的原始类型;
- 可空类型、枚举类型、各种集合类型、结构与类;
- 复杂的嵌套类型采用递归方式转换;
- 如果默认的转换满足不了需求,默认的映射配置器还允许指定命名约定,自定义构造函数,自定义转换器,忽略成员等。
4.1普通的映射
字段名称有相同的
public class UserInfo
{
public int id { get; set; }
public string name { get; set; }
public string address { get; set; }
}
public class UserInfoDTO
{
public string name { get; set; }
public string address { get; set; }
}
var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>();
UserInfoDTO userdto = mapper.Map(user);
4.2忽略掉某个字段的映射
public class UserInfo
{
public int id { get; set; }
public string name { get; set; }
public string address { get; set; }
}
public class UserInfoDTO
{
public string id { get; set; }
public string name { get; set; }
public string address { get; set; }
}
var user = new UserInfo {
id = 12,
name = "张三",
address = "北京"
};
var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>(
new DefaultMapConfig()
.IgnoreMembers<UserInfo, UserInfoDTO>(new string[] { "name" })
);
UserInfoDTO userdto = mapper.Map(user);
4.3给空元素赋默认值
public class UserInfo
{
public int id { get; set; }
public string name { get; set; }
public string address { get; set; }
public DateTime? godate { get; set; }
}
public class UserInfoDTO
{
public string id { get; set; }
public string name { get; set; }
public string address { get; set; }
public DateTime godate { get; set; }
}
var user = new UserInfo {
id = 12,
name = "张三",
address = null,
godate = null
};
var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>(
new DefaultMapConfig()
//如果日期为空设置为当前时间
.NullSubstitution<DateTime?, DateTime>((value) => DateTime.Now)
//如果string类型为null赋值为“”
.NullSubstitution<string, string>((value) => "")
);
UserInfoDTO userdto = mapper.Map(user);
4.4两个实体之间名字不一致,需要映射
public class UserInfo
{
public int id { get; set; }
public string name { get; set; }
public string address { get; set; }
}
public class UserInfoDTO
{
public int id { get; set; }
public string name { get; set; }
public string userAddress { get; set; }
}
var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>(
new DefaultMapConfig()
.MatchMembers((x, y) =>
{
if (x == "address" && y == "userAddress")
{
return true;
}
return x == y;
})
);
UserInfoDTO userdto = mapper.Map(user);
4.4有外键关联,需要映射出外键所带名字
public class UserInfo
{
public int id { get; set; }
public string name { get; set; }
public string address { get; set; }
public Teacher teacher { get; set; }
}
public class Teacher
{
public int id { get; set; }
public string name { get; set; }
}
public class UserInfoDTO
{
public int id { get; set; }
public string name { get; set; }
public string teacher { get; set; }
}
var user = new UserInfo {
id = 12,
name = "张三",
address = "北京",
teacher = new Teacher {
id = 11,
name = "王五"
}
};
var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>(
new DefaultMapConfig()
.ConvertUsing<Teacher, string>(t => t.name)
);
UserInfoDTO userdto = mapper.Map(user);
4.3多种特殊情况并存
public class Sourse
{
public int A;
public decimal? B;
public string C;
public Inner D;
public string E;
}
public class Dest
{
public int? A;
public decimal B;
public DateTime C;
public Inner2 D;
public string F;
}
public class Inner
{
public long D1;
public Guid D2;
}
public class Inner2
{
public long D12;
public Guid D22;
}
ObjectsMapper<Sourse, Dest> mapper1 =
new ObjectMapperManager().GetMapper<Sourse, Dest>(
new DefaultMapConfig()
.IgnoreMembers<Sourse, Dest>(new string[] { "A" })
.NullSubstitution<decimal?, decimal>((value) => -1M)
.ConvertUsing<Inner, Inner2>(value => new Inner2 { D12 = value.D1, D22 = value.D2 })
.PostProcess<Dest>((value, state) => { value.F = "nothing"; return value; })
);
Dest dst = mapper1.Map(src);
参考
5、EmitMapper 和TinyMapper 两者简单对比
原文章:EmitMapper 和TinyMapper 两者简单对比