安装方式:使用vs自带的nuget管理工具,搜索AutoMapper,选择第一个安装到你的项目即可。
<强>先说说DTO 强>
<强> DTO是个什么东东? 强>
DTO(数据传输对象)就是数据传输对象,说白了就是一个对象,只不过里边全是数据而已。
<强>为什么要用dto # 63; 强>
1, DTO更注重数据,对领域对象进行合理封装,从而不会将领域对象的行为过分暴露给表现层
2, DTO是面向UI的需求而设计的,而领域模型是面向业务而设计的。因此DTO更适合于和表现层的交互,通过DTO我们实现了表现层与领域模型之间的解耦,因此改动领域模型不会影响UI层
3, DTO说白了就是数据而已,不包含任何的业务逻辑,属于瘦身型的对象,使用时可以根据不同的UI需求进行灵活的运用
我从网上找了一些资料,
<强> AutoMapper
强>
现在我们既然知道了使用DTO的好处,那么我们肯定也想马上使用它,但是这里会牵扯一个问题:怎样实现DTO和领域模型之间的转换?
有两个思路,我们要么自己写转换代码,要么使用工具。不过就应用而言,我还是觉得用工具比较简单快捷,那就使用工具吧。其实这样的转换工具很多,不过我还是决定使用AutoMapper,因为它足够轻量级,而且也非常流行,国外的大牛们都使用它。使用AutoMapper可以很方便的实现DTO和领域模型之间的转换,它是一个强大的面向对象映射工具。
下载了个演示,然后自己又写了一遍,我把AutoMapper的使用分为两种:
1,视图模型与实体的字段名字是一致的,viewmodel的字段可以比实体中的字段少,但是不能多。
还有一种情况是:源实体中的字段名字是Getxxx,那么视图模型中对应的字段可以是xxx,也会自动对应赋值,比如我写的演示中源实体中木屐,viewmodel中的;
再有一种情况就是实体中的实体赋值,在我写的这个例子中,源实体中包含的实体类字段为子,里面包含的字段名字为时代,
那么destmodel中对应的字段名字可以是:亚期,那么automapper就可以自动为你赋值了,大家看最后的运行结果。
给大家看下我建的源实体:
公开课Source1 { 公共字符串名称{设置;得到;} 公共字符串gata{设置;得到;} 公共字符串GetD{设置;得到;} 公共字符串SetB{设置;得到;} 公共字符串c{设置;得到;} 公共SubSource1子{设置;得到;} } 公开课SubSource1 { 公共字符串年龄{设置;得到;} } >之前还有viewmodel(要转化成为你想要的模型):
公开课Dest1 { 公共字符串名称{设置;得到;} 公共字符串{集;得到;} 公共字符串C{设置;得到;} 公共字符串亚期{设置;得到;} D{公共字符串设置;得到;} } >之前我封装的扩展方法:
///& lt; summary>///类型映射,默认字段名字一一对应///& lt;/summary>///& lt; typeparam name=" TDestination祝辞转化之后的模型,可以理解为viewmodel///& lt; typeparam name=" TSource祝辞要被转化的实体,Entity///& lt;参数name=霸础痹诳梢允褂谜飧隼┱狗椒ǖ睦嘈?任何引用类型& lt;/param>///& lt; returns>转化之后的实体& lt;/returns> 公共静态TDestination MapTo(这TSource源) TDestination:类 TSource:类 { 如果(源==null)返回缺省(TDestination); var配置=new MapperConfiguration (cfg=比;cfg.CreateMap ()); var mapper=config.CreateMapper (); 返回mapper.Map (源); } 使用方式:
新source1 var source1={ Name="源", 子=new SubSource1{年龄=" 25 "}, c=" c ", gata=癆”, SetB=" B " }; var destViewModel=source1.MapTo(); >之前 运行结果: