初识TinyMapper

TinyMapper是开源的对象映射框架,功能和AutoMapper一样。官网介绍,TinyMapper映射效率很高,下图是官方给的比较结果:

TinyMapper使用简单,只有Bind,Mapper两个操作;而且支持的配置也很简单(很有限)。下面就让我们来进一步认识下TinyMapper。

安装TinyMapper

通过Nuget安装TinyMapper,本次使用版本为2.0.8。

TinyMapper映射

1. 绑定映射关系

  1. public static void Bind<TSource, TTarget>();
  2. public static void Bind<TSource, TTarget>(Action<IBindingConfig<TSource, TTarget>> config);

2. 执行映射,获取映射结果

  1. public static TTarget Map<TSource, TTarget>(TSource source, TTarget target = default(TTarget));
  2. public static TTarget Map<TTarget>(object source);

注意:TinyMapper的映射对象必须是Public类型。

简单映射

创建两个映射对象:

  1. public class Product
  2. {
  3. public Guid Id { get; set; }
  4.  
  5. public string Name { get; set; }
  6.  
  7. public decimal Price { get; set; }
  8. }
  9.  
  10. public class ProductDTO
  11. {
  12. public Guid Id { get; set; }
  13.  
  14. public string Name { get; set; }
  15.  
  16. public decimal Price { get; set; }
  17. }

绑定映射关系并执行映射:

  1. [TestMethod]
  2. public void TestSimple()
  3. {
  4. var product = new Product()
  5. {
  6. Id = Guid.NewGuid(),
  7. Name = "Product" + DateTime.Now.Ticks,
  8. Price = 12
  9. };
  10.  
  11. //1. 创建映射关系
  12. TinyMapper.Bind<Product, ProductDTO>();
    //TinyMapper.Bind<Product, ProductDTO>(); //直接建立对象绑定关系也是可以的
  13.  
  14. //2. 执行映射
  15. var productDto = TinyMapper.Map<ProductDTO>(product);
  16.  
  17. Assert.IsNotNull(productDto);
  18. Assert.AreEqual(12, productDto.Price);
  19. Assert.IsNotNull(productDto.Name);
  20. }

集合映射

仍然使用上面的映射对象,集合验证方式如下:

  1. [TestMethod]
  2. public void TestList()
  3. {
  4. var products = new List<Product>()
  5. {
  6. new Product()
  7. {
  8. Id = Guid.NewGuid(),
  9. Name = "Product" + DateTime.Now.Ticks,
  10. Price = 5
  11. },
  12. new Product()
  13. {
  14. Id = Guid.NewGuid(),
  15. Name = "Product" + DateTime.Now.Ticks,
  16. Price = 10
  17. }
  18. };
  19.  
  20. //1. 创建映射关系
  21. TinyMapper.Bind<List<Product>, List<ProductDTO>>();
  22.  
  23. //2. 执行映射
  24. var productDtos = TinyMapper.Map<List<Product>>(products);
  25.  
  26. Assert.IsNotNull(productDtos);
  27. Assert.AreEqual(2, productDtos.Count);
  28. }

  

执行映射转换时,TinyMapper不支持接口类型:IList<T>, ICollection<T>, IEnumerable<T>.

  1. TinyMapper.Map<ICollection<Product>>(products); //执行时会抛出异常

映射配置

TinyMapper支持简单的映射配置:

指定字段映射

  1. public class Product
  2. {
  3. public Guid Id { get; set; }
  4.  
  5. public string Name { get; set; }
  6.  
  7. public decimal Price { get; set; }
  8. }
  9.  
  10. public class ProductDTO
  11. {
  12. public string Id { get; set; }
  13.  
  14. public string Name { get; set; }
  15.  
  16. public decimal Money { get; set; }
  17. }
  18.  
  19. [TestMethod]
  20. public void TestMapperConfig()
  21. {
  22. var product = new Product()
  23. {
  24. Id = Guid.NewGuid(),
  25. Name = "Product" + DateTime.Now.Ticks,
  26. Price = 12
  27. };
  28.  
  29. //1. 创建映射关系
  30. TinyMapper.Bind<Product, ProductDTO>(cfg =>
  31. {
  32. cfg.Bind(src => src.Price, dest => dest.Money); //指定字段映射
  33. });
  34.  
  35. //2. 执行映射
  36. var productDto = TinyMapper.Map<ProductDTO>(product);
  37.  
  38. Assert.IsNotNull(productDto);
  39. Assert.AreEqual(12, productDto.Money);
  40. }

映射时不管某些字段

  1. TinyMapper.Bind<Product, ProductDTO>(cfg =>
  2. {
  3. cfg.Ignore(src => src.Price); //映射时不管某些字段
  4. });

注意:TinyMapper默认会根据字段名称进行映射,而不管字段的类型。也就是说,如果源对象字段名称与目标对象字段名称一致,但是类型不一致且不能进行强制转换时,会抛出异常。

TinyMapper简单封装

  1. public class TinyMapperUtil
  2. {
  3. /// <summary>
  4. /// 创建映射关系
  5. /// </summary>
  6. /// <typeparam name="TSource"></typeparam>
  7. /// <typeparam name="TDestination"></typeparam>
  8. public static void Bind<TSource, TDestination>()
  9. {
  10. TinyMapper.Bind<TSource, TDestination>();
  11. }
  12.  
  13. /// <summary>
  14. /// 映射对象
  15. /// </summary>
  16. /// <typeparam name="TDestination"></typeparam>
  17. /// <param name="source"></param>
  18. /// <returns></returns>
  19. public static TDestination Map<TDestination>(object source)
  20. {
  21. if (source == null)
  22. {
  23. return default(TDestination);
  24. }
  25. else
  26. {
  27. return TinyMapper.Map<TDestination>(source);
  28. }
  29. }
  30. }

总结

以上基本是TinyMapper提供的所有特性及操作。相比AutoMapper,功能很有限,不支持扁平映射,也不支持接口集合转换等。但使用起来还是很简单的,仍然可以考虑在项目中使用。

相关资料可以参考官网介绍:http://tinymapper.net/

TinyMapper 使用总结的更多相关文章

  1. Asp.net 面向接口可扩展框架之使用“类型转化基础服务”测试四种Mapper(AutoMapper、EmitMapper、NLiteMapper及TinyMapper)

    Asp.net 面向接口可扩展框架的“类型转化基础服务”是我认为除了“核心容器”之外最为重要的组成部分 但是前面博文一出,争议很多,为此我再写一篇类型转化基础服务和各种Mapper结合的例子,顺便对各 ...

  2. [C#] 记-TinyMapper使用

    What is TinyMapper TinyMapper - a tiny and quick object mapper for .Net. The main advantage is perfo ...

  3. EmitMapper 和TinyMapper 两者简单对比

    EmitMapper 和TinyMapper 两者的性能都是很高,相比autoMapper 速度不知道快了多少倍,因为使用的最多EmitMapper,所在业余时间做了一下测试对比. 测试数据:10万条 ...

  4. C# TinyMapper

    https://github.com/TinyMapper/TinyMapper 据说性能蛮高的,我没对比测试过. NuGet安装下. 新增三个实体. public class A { public ...

  5. .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...

  6. .NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper

    好久没有写文章,工作甚忙,但每日还是关注.NET领域的开源项目.五一休息,放松了一下之后,今天就给大家介绍一个轻量级的对象映射工具Tiny Mapper:号称是.NET平台最快的对象映射组件.那就一起 ...

  7. DotNet 资源大全中文版(Awesome最新版)

    Awesome系列的.Net资源整理.awesome-dotnet是由quozd发起和维护.内容包括:编译器.压缩.应用框架.应用模板.加密.数据库.反编译.IDE.日志.风格指南等. 算法与数据结构 ...

  8. Tiny Mapper

    今天看到一个对象映射工具-TinyMapper 1.介绍 Tiny Mapper是一个.net平台的开源的对象映射组件,其它的对象映射组件比如AutoMapper有兴趣的可以去看,Tiny Mappe ...

  9. ABP理论学习之N层架构

    返回总目录 自从写这个系列博客之后,发现很多园友还是希望有个直接运行的demo,其实在github上就有官方的demo,我直接把这demo的链接放到这里吧,另外,我分析,这些找不到demo的同学,很可 ...

随机推荐

  1. 【树状数组】POJ 2352 Stars

    /** * @author johnsondu * @time 2015-8-22 * @type Binary Index Tree * ignore the coordinate of y and ...

  2. 入门vue----(介绍)

    声明式渲染 Vue.js 的核心是一个允许采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统: <div id="app"> {{ message }} < ...

  3. Office Add-in 架构和入门

    作者:陈希章 发表于2017年7月12日 前言 从2月26日开始写这个Office 365开发概览系列文章-- https://aka.ms/office365devguide,到现在已经有17篇文章 ...

  4. 十一、Spring Boot 集成Shiro和CAS

    1.Shiro 是什么?怎么用? 2.Cas 是什么?怎么用? 3.最好有spring基础 首先看一下下面这张图: 第一个流程是单纯使用Shiro的流程. 第二个流程是单纯使用Cas的流程. 第三个图 ...

  5. JavaScript获取浏览器版本等信息

    ** 不同浏览器版本可能存在差异,使用时请测试自己的环境 ** 测试时各个浏览器版本 IE: 11.953.14393.0 Edge: Microsoft Edge 38.14393.0.0;Micr ...

  6. TypeScript学习笔记之类

    TypeScript的类,简单地定义如下: class Person { x: number; // 默认为public类型 y: number; constructor(x1: number, y1 ...

  7. 基于Vue的SPA动态修改页面title的方法

    最近基于VUE做个SPA手机端web发现动态修改页面标题通过document.title=xxxx 来修改着实蛋疼,而且在IOS的微信端据说没效果.百度发现要针对IOS的微信做点额外的操作,即:创建一 ...

  8. ubuntu16.04 查询ip,网关,dns信息

    用ifconfig命令只能查询ip,子网掩码信息,不能获取dns和网关信息 用下面命令即可查询 nmcli dev show

  9. [置顶] xamarin Tablayout+Viewpager+Fragment顶部导航栏

    最近几天不忙,所以把项目中的顶部导航栏的实现归集一下.android中使用TabLayout+ViewPager+Fragment制作顶部导航非常常见,代码实现也比较简单.当然我这个导航栏是基于xam ...

  10. 利用generator自动生成model(实体)、dao(接口)、mapper(映射)

    1 在MySQL数据库中创建相应的表 /* Navicat MySQL Data Transfer Source Server : 虚拟机_zeus01 Source Server Version : ...