automapper java 有什么_AutoMapper简介

先说说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工具。

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

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

二、吃点栗子

栗子1(两个类型之间的映射)

Mapper.CreateMap();

AddressDto dto= newAddressDto

{

Country= "China",

City= "ShangHai",

Street= "JinZhong Street"};

Address address= Mapper.Map(Dto);

栗子2(两个映射的对象有部分字段名称不一样)

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

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

栗子3(列表类型之间的映射)

源类型List

,目标类型List:

AutoMapper.Mapper.CreateMap< Address, AddressDto >();

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

栗子4(映射在增改查中的应用)

public classProductBll

{

Public IProductRepository productRepository{set; get; }publicProductDTO CreateProduct(ProductDTO productDTO)

{

Mapper.CreateMap();

Product product= Mapper.Map(productDTO);

productRepository.AddProduct(product);returnproductDTO;

}public ListGetProduct()

{

Mapper.CreateMap();

List arr = new List();

productRepository.GetProduct().ForEach(i=>{

arr.Add(Mapper.Map(i));

});returnarr;

}publicProductDTO ModifyProduct(ProductDTO productDTO)

{

Mapper.CreateMap();

Product product= Mapper.Map(productDTO);

productRepository.ModifyProduct(product);returnproductDTO;

}

}

三、让AutoMapper使用变得简单

吃过上面的栗子,你觉得怎么样呢?如果想继续吃,那就去查看AutoMapper的具体API文档吧!倘若在项目中真正要用的时候,我觉得还是应该对AutoMapper的方法进行一些整理,最好能够封装一下,这里我通过扩展方法的形式将其封装为AutoMapperHelper,这样以后使用AutoMapper就变的SO EASY了~

usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.Data;usingAutoMapper;namespaceInfrastructure.Utility

{///

///AutoMapper扩展帮助类///

public static classAutoMapperHelper

{///

///类型映射///

public static T MapTo(this objectobj)

{if (obj == null) return default(T);

Mapper.CreateMap(obj.GetType(),typeof(T));return Mapper.Map(obj);

}///

///集合列表类型映射///

public static List MapToList(thisIEnumerable source)

{foreach (var first insource)

{var type =first.GetType();

Mapper.CreateMap(type,typeof(TDestination));break;

}return Mapper.Map>(source);

}///

///集合列表类型映射///

public static List MapToList(this IEnumerablesource)

{//IEnumerable 类型需要创建元素的映射

Mapper.CreateMap();return Mapper.Map>(source);

}///

///类型映射///

public static TDestination MapTo(thisTSource source, TDestination destination)where TSource : class

where TDestination : class{if (source == null) returndestination;

Mapper.CreateMap();returnMapper.Map(source, destination);

}///

///DataReader映射///

public static IEnumerable DataReaderMapTo(thisIDataReader reader)

{

Mapper.Reset();

Mapper.CreateMap>();return Mapper.Map>(reader);

}

}

}

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

//对象映射

ShipInfoModel shipInfoModel = ShipInfo.MapTo();

//列表映射

List< ShipInfoModel > shipInfoModellist = ShipInfoList.MapToList();

小结

在项目中多使用DTO实现表现层与领域Model的解耦,用AutoMapper来实现DTO与领域Model的相互转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值