最近公司開發項目前端使用一個js框架,后端使用ef,js前台讀取的json采用實體的dto來進行生成。
在網上看到了EmitMapper相對其他映射框架處理速度可以更快,就拿來用了。下面是代碼中常用的幾個塊。
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);
2.有外鍵關聯,需要映射出外鍵所帶名字
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);
3.兩個實體之間名字不一致,需要映射。
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.需要對某一個字段進行特殊處理
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 userAddress { get; set; } public string userJson { get; set; } } var user = new UserInfo { id = 12, name = "張三", address = "北京" }; var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>( new DefaultMapConfig() .PostProcess<UserInfoDTO>((value, state) => { //在id編號前加上今年的年份 value.id = DateTime.Now.ToString("yyyy") + value.id; //實體的json格式 value.userJson = "{\"id\":\"" + value.id + "\",\"name\":\"" + value.name + "\"}"; return value; }) ); UserInfoDTO userdto = mapper.Map(user);
5.忽略掉某個字段的映射
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);
6.給空元素賦默認值
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);
常用的就上面幾點,對於更深入的。有待以后研究。。。。。
