一、前言
DTO(Data Transfer Object)数据传输对象,注意关键字“数据”两个字,并不是对象传输对象(Object Transfer Object),所以只是传输数据,并不包含领域业务处理,虽然用途只是传输数据,但本身其实也是对象,完成与领域对象之间的转换,就像上面说的值对象一样,某种意义上DTO可以看做是值对象的集合,只不过是和领域对象之间的映射,不包含任何的业务逻辑。
为什么要使用DTO?主要原因是隔离Domain Model,使改动领域模型而不影响UI,还有就是保持领域模型的安全,不暴露业务逻辑。还有就是在分布式模式下,不同的场景使用相同的数据结构有不同的 需求,而我们又不得不做一些数据转化,这是很繁琐的,如果我们在项目初期,做DTO的分析,这样我们就会省很多的事,而且还不会影响整个项目的业务流程, 也方便以后对项目进行扩展。
二、实例代码
先使用Nuget程序包添加AutoMapper引用
1.创建实体对象
public class User { public int UserID; public string UserName; public string Sex; public string Address; }
2.创建UI的DTO实体对象
public class UserDTO { public int ID; public string Name; public string Sex; public string Address; public string Remark; }
3.调用实例,记住用法就可以了
class Program { static void Main(string[] args) { //初始化实体对象 User user = ,UserName="小柯",Sex="男",Address="aaabbbccc"}; //配置AutoMapper //因为UserDTO和User类中一些字段名字没有对应上,可以初始映射属性 Mapper.Initialize(i => { i.CreateMap<User, UserDTO>()//创建映射 .ForMember(uDTO => uDTO.ID, u => u.MapFrom(a => a.UserID)) .ForMember(uDTO => uDTO.Name, u => u.MapFrom(a => a.UserName)) .ForMember(uDTO => uDTO.Address, u => u.MapFrom(a => a.Address.ToUpper())) //将字母转成大写再赋值给DTO .ForMember(uDTO => uDTO.Remark, u => u.Ignore()); //User类中没有Remark,而UserDTO中存在,使用Ignore()忽视该属性,string类型默认为null了 }); //调用映射方法返回DTO数据传输对象 UserDTO userDTO = Mapper.Map<User, UserDTO>(user); } }
结果:
参考资料:
http://www.cnblogs.com/xishuai/p/3691787.html