初识TinyMapper
TinyMapper是开源的对象映射框架,功能和AutoMapper一样。官网介绍,TinyMapper映射效率很高,下图是官方给的比较结果:
TinyMapper使用简单,只有Bind,Mapper两个操作;而且支持的配置也很简单(很有限)。下面就让我们来进一步认识下TinyMapper。
安装TinyMapper
通过Nuget安装TinyMapper,本次使用版本为2.0.8。
TinyMapper映射
1. 绑定映射关系
public static void Bind<TSource, TTarget>(); public static void Bind<TSource, TTarget>(Action<IBindingConfig<TSource, TTarget>> config);
2. 执行映射,获取映射结果
public static TTarget Map<TSource, TTarget>(TSource source, TTarget target = default(TTarget)); public static TTarget Map<TTarget>(object source);
注意:TinyMapper的映射对象必须是Public类型。
简单映射
创建两个映射对象:
public class Product { public Guid Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } } public class ProductDTO { public Guid Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } }
绑定映射关系并执行映射:
[TestMethod] public void TestSimple() { var product = new Product() { Id = Guid.NewGuid(), Name = "Product" + DateTime.Now.Ticks, Price = 12 }; //1. 创建映射关系 TinyMapper.Bind<Product, ProductDTO>();
//TinyMapper.Bind<Product, ProductDTO>(); //直接建立对象绑定关系也是可以的 //2. 执行映射 var productDto = TinyMapper.Map<ProductDTO>(product); Assert.IsNotNull(productDto); Assert.AreEqual(12, productDto.Price); Assert.IsNotNull(productDto.Name); }
集合映射
仍然使用上面的映射对象,集合验证方式如下:
[TestMethod] public void TestList() { var products = new List<Product>() { new Product() { Id = Guid.NewGuid(), Name = "Product" + DateTime.Now.Ticks, Price = 5 }, new Product() { Id = Guid.NewGuid(), Name = "Product" + DateTime.Now.Ticks, Price = 10 } }; //1. 创建映射关系 TinyMapper.Bind<List<Product>, List<ProductDTO>>(); //2. 执行映射 var productDtos = TinyMapper.Map<List<Product>>(products); Assert.IsNotNull(productDtos); Assert.AreEqual(2, productDtos.Count); }
执行映射转换时,TinyMapper不支持接口类型:IList<T>, ICollection<T>, IEnumerable<T>.
TinyMapper.Map<ICollection<Product>>(products); //执行时会抛出异常
映射配置
TinyMapper支持简单的映射配置:
指定字段映射
public class Product { public Guid Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } } public class ProductDTO { public string Id { get; set; } public string Name { get; set; } public decimal Money { get; set; } } [TestMethod] public void TestMapperConfig() { var product = new Product() { Id = Guid.NewGuid(), Name = "Product" + DateTime.Now.Ticks, Price = 12 }; //1. 创建映射关系 TinyMapper.Bind<Product, ProductDTO>(cfg => { cfg.Bind(src => src.Price, dest => dest.Money); //指定字段映射 }); //2. 执行映射 var productDto = TinyMapper.Map<ProductDTO>(product); Assert.IsNotNull(productDto); Assert.AreEqual(12, productDto.Money); }
映射时不管某些字段
TinyMapper.Bind<Product, ProductDTO>(cfg => { cfg.Ignore(src => src.Price); //映射时不管某些字段 });
注意:TinyMapper默认会根据字段名称进行映射,而不管字段的类型。也就是说,如果源对象字段名称与目标对象字段名称一致,但是类型不一致且不能进行强制转换时,会抛出异常。
TinyMapper简单封装
public class TinyMapperUtil { /// <summary> /// 创建映射关系 /// </summary> /// <typeparam name="TSource"></typeparam> /// <typeparam name="TDestination"></typeparam> public static void Bind<TSource, TDestination>() { TinyMapper.Bind<TSource, TDestination>(); } /// <summary> /// 映射对象 /// </summary> /// <typeparam name="TDestination"></typeparam> /// <param name="source"></param> /// <returns></returns> public static TDestination Map<TDestination>(object source) { if (source == null) { return default(TDestination); } else { return TinyMapper.Map<TDestination>(source); } } }
总结
以上基本是TinyMapper提供的所有特性及操作。相比AutoMapper,功能很有限,不支持扁平映射,也不支持接口集合转换等。但使用起来还是很简单的,仍然可以考虑在项目中使用。
相关资料可以参考官网介绍:http://tinymapper.net/