AutoMapper在项目中的应用

摘要:
Addressaddress=映射器。映射<映射器.CreateMap<varaddressDtoList=自动映射器.Mapper.Map<产品arr=新列表<(); productRepository.GetProduct().ForEach(i=>{arr.Add(Mapper.Map<Product;

  一、先说说DTO

  DTO是个什么东东?

  DTO(Data Transfer Object)就是数据传输对象,说白了就是一个对象,只不过里边全是数据而已。

  为什么要用DTO?

  1、DTO更注重数据,对领域对象进行合理封装,从而不会将领域对象的行为过分暴露给表现层。

  2、DTO是面向UI的需求而设计的,而领域模型是面向业务而设计的。因此DTO更适合于和表现层的交互,通过DTO我们实现了表现层与领域Model之间的解耦,因此改动领域Model不会影响UI层。

  3、DTO说白了就是数据而已,不包含任何的业务逻辑,属于瘦身型的对象,使用时可以根据不同的UI需求进行灵活的运用。

  二、AutoMapper

  现在我们既然知道了使用DTO的好处,那么我们肯定也想马上使用它,但是这里会牵扯一个问题:怎样实现DTO和领域Model之间的转换?

  有两个思路,我们要么自己写转换代码,要么使用工具。不过就应用而言,我还是觉得用工具比较简单快捷,那就使用工具吧。其实这样的转换工具很多,不过我还是决定使用AutoMapper,因为它足够轻量级,而且也非常流行,国外的大牛们都使用它。使用AutoMapper可以很方便的实现DTO和领域Model之间的转换,它是一个强大的Object-Object Mapping工具。

  1、如何添加AutoMapper到项目中?

  在vs中使用打开工具-库程序包管理器-程序包管理控制平台,输入“Install-Package AutoMapper”命令,就可以把AutoMapper添加到项目中了。

  2、案例源码

  两个类型之间的映射

Mapper.CreateMap<AddressDto, Address>();
AddressDto dto = new AddressDto
{
    Country = "China",
    City = "ShangHai",
    Street = "JinZhong Street"
};
Address address = Mapper.Map<AddressDto,Address>(Dto);

  两个映射的对象有部分字段名称不一样

  AddressDto到Address的映射,AddressDto的字段CountryName要对应Address的字段Country:

Mapper.CreateMap<AddressDto, Address>(). ForMember(d => d.Country, opt => opt.MapFrom(s => s.CountryName));

  列表类型之间的映射

  源类型List<Address>,目标类型List<AddressDto>:

AutoMapper.Mapper.CreateMap< Address, AddressDto >();
var addressDtoList = AutoMapper.Mapper.Map<List< Address >, List< AddressDto >>( addressList);

  映射在增改查中的应用

public class ProductBll
{
    Public IProductRepository productRepository{ set; get; }
    public ProductDTO CreateProduct(ProductDTO productDTO)
    {
        Mapper.CreateMap<ProductDTO, Product>();
        Product product = Mapper.Map<ProductDTO, Product>(productDTO);
        productRepository.AddProduct(product);
        return productDTO;
    }

    public List<ProductDTO> GetProduct()
    {
        Mapper.CreateMap<Product, ProductDTO>();
        List<ProductDTO> arr = new List<ProductDTO>();
        productRepository.GetProduct().ForEach(i =>
        {
            arr.Add(Mapper.Map<Product, ProductDTO>(i));
        });
        return arr;
    }

     public ProductDTO ModifyProduct(ProductDTO productDTO)
    {
        Mapper.CreateMap<ProductDTO, Product>();
        Product product = Mapper.Map<ProductDTO, Product>(productDTO);
        productRepository.ModifyProduct(product);
        return productDTO;
    }
}

  三、让AutoMapper使用变得简单

  倘若在项目中真正要用的时候,我觉得还是应该对AutoMapper的方法进行一些整理,最好能够封装一下,这里我通过扩展方法的形式将其封装为AutoMapperHelper,这样以后使用AutoMapper就变的SO EASY了。

using System.Collections;
using System.Collections.Generic;
using System.Data;
using AutoMapper;
namespace Infrastructure.Utility

{
    /// <summary>
    /// AutoMapper扩展帮助类
    /// </summary>
    public static class AutoMapperHelper
    {
        /// <summary>
        ///  类型映射
        /// </summary>
        public static T MapTo<T>(this object obj)
        {
            if (obj == null) return default(T);
            Mapper.CreateMap(obj.GetType(), typeof(T));
            return Mapper.Map<T>(obj);
        }
        /// <summary>
        /// 集合列表类型映射
        /// </summary>
        public static List<TDestination> MapToList<TDestination>(this IEnumerable source)
        {
            foreach (var first in source)
            {
                var type = first.GetType();
                Mapper.CreateMap(type, typeof(TDestination));
                break;
            }
            return Mapper.Map<List<TDestination>>(source);
        }
        /// <summary>
        /// 集合列表类型映射
        /// </summary>
        public static List<TDestination> MapToList<TSource, TDestination>(this IEnumerable<TSource> source)
        {
            //IEnumerable<T> 类型需要创建元素的映射
            Mapper.CreateMap<TSource, TDestination>();
            return Mapper.Map<List<TDestination>>(source);
        }
        /// <summary>
        /// 类型映射
        /// </summary>
        public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination)
            where TSource : class
            where TDestination : class
        {
           if (source == null) return destination;
            Mapper.CreateMap<TSource, TDestination>();
            return Mapper.Map(source, destination);
        }
        /// <summary>
        /// DataReader映射
        /// </summary>
        public static IEnumerable<T> DataReaderMapTo<T>(this IDataReader reader)
        {
            Mapper.Reset();
            Mapper.CreateMap<IDataReader, IEnumerable<T>>();
            return Mapper.Map<IDataReader, IEnumerable<T>>(reader);
        }
    }
}

  你可以像下面的例子这样使用:

//对象映射
ShipInfoModel  shipInfoModel =  ShipInfo.MapTo<ShipInfoModel>();
//列表映射
List< ShipInfoModel > shipInfoModellist = ShipInfoList.MapToList<ShipInfoModel>();

  四、小结

  在项目中多使用DTO实现表现层与领域Model的解耦,用AutoMapper来实现DTO与领域Model的相互转换,会让你体会到AutoMapper的便利。

参考链接:http://www.cnblogs.com/WeiGe/p/3835523.html

免责声明:文章转载自《AutoMapper在项目中的应用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PHP stdClass类 使用SQL分组取每组前一(或几)条记录(排名)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

20150916自动化测试之Appinum For Android(环境搭建之下载更新安装AndroidSDK包)

  在经历一个多星期的延迟后,终究是运气极好,解决了Android SDK更新时遇到的google访问问题   遇到的问题:      解决方法:   1.启动 Android SDK Manager ;  2.打开主界面,选择Tools->Options;  3.在弹出的窗口中,代理服务器输入mirrors.neusoft.edu.cn,端口:80...

FreeMarker之根据模板生成Java代码

FreeMarker根据模板生成Java代码,光这句话,大家想必也知道它的应用了,比如流行的DRY原则,该原则的意思,可简单概述为"不要写重复的代码"。 比如Java中三层架构,数据访问层,业务逻辑层,表现层,光这三层就出现重复性的增删改查及其相关的界面代码。 如何不写重复的增删改查相关的代码,可以参考我的MP实战系列文章和MyBatis的逆向工程(针对J...

学习Maven之Cobertura Maven Plugin

cobertura-maven-plugin是个什么鬼? cobertura-maven-plugin是一个校验单元测试用例覆盖率的工具,可以生成一个测试覆盖率报告,可以给单元测试用例编写提供参考. helloword cobertura-maven-plugin的使用也很简单,首先你要有源码,然后要有对这个源码编写的测试代码,最后在pom.xml中配置上...

微信小程序如何播放音频,这里以本地mp3文件举例。

参考:https://blog.csdn.net/bangyiqing/article/details/104966135      官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.html Page({ data: {...

【Android】XML文件的解析

1.首先我们可以在res包路径下创建一个raw包,然后在raw下创建一个email.xml 文件,并修改其内容如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <email> 3 <from>123@163.com</from> 4 <to&g...

七、玩转select条件查询

前言:   电商中:我们想查看某个用户所有的订单,或者想查看某个用户在某个时间段内所有的订单,此时我们需要对订单表数据进行筛选,按照用户、时间进行过滤,得到我们期望的结果。   此时我们需要使用条件查询来对指定表进行操作,我们需要了解sql中的条件查询常见的玩法。 本篇内容 1、查询条件语法 2、条件查询运算符详解(=、<、>、<=、&g...