TinyMapper是開源的對象映射框架,功能和AutoMapper同樣。官網介紹,TinyMapper映射效率很高,下圖是官方給的比較結果:app
TinyMapper使用簡單,只有Bind,Mapper兩個操做;並且支持的配置也很簡單(頗有限)。下面就讓咱們來進一步認識下TinyMapper。框架
經過Nuget安裝TinyMapper,本次使用版本爲2.0.8。ui
1. 綁定映射關係.net
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類型。blog
建立兩個映射對象:接口
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; } }
綁定映射關係並執行映射:ci
[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); }
仍然使用上面的映射對象,集合驗證方式以下:get
[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>.string
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默認會根據字段名稱進行映射,而無論字段的類型。也就是說,若是源對象字段名稱與目標對象字段名稱一致,可是類型不一致且不能進行強制轉換時,會拋出異常。
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/