初識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/
