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

 

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

.NET开源目录:【目录】本博客其他.NET开源项目文章目录

本文原文地址:http://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_TinyMapper.html

临时更新:感谢@ 郭明锋的意见,为了避免新手误解,这里说明一下,Tiny Mapper的映射关系在Bind的时候,其实是将映射关系保存在一个静态的私有字典中,大家在使用的时候可以不需要每次都配置或者Bind。方法比较灵活,例如:你可以在实体类中封装一个方法,在方法内部进行映射关系的配置;你还可以将系统所有的配置映射关系放在一起,在使用前初始化一次就可以了。

1.Tiny Mapper基本介绍

Tiny Mapper是一个.net平台开源的对象映射组件。说到.NET平台的对象映射,大名鼎鼎的可能就是AutoMapper。那先看看Tiny Mapper的特点

1.1 难以置信的快速

这是Tiny Mapper标榜最大的特点之一:快。那究竟有多快,我们看看官方的测试截图,由于时间紧张,我没有进行测试对比,有空试试。

1.2 非常容易使用

使用TinyMapper非常简单,它的设计简单,使用NuGet包,可以快速安装使用,DLL也才50K大小不到,所以非常轻量级。

1.3 开源

TinyMapper是一个开源项目,所以你可以参与更新和自己修改代码。

2.Tiny Mapper 基本使用

首先,通过NuGet下载安装Tiny Mapper,如下图:

然后添加引用:

1
2
using Nelibur.ObjectMapper;
using Nelibur.ObjectMapper.Bindings;

接下来,我们准备2个要相互映射的类型,Person和PersonDto,结构分别如下:

1
2
3
4
5
6
7
8
9
10
11
12
public class Person
{
    public String Id { getset; }
    public String Name { getset; }
    public Int32 Age { getset; }
}
public class PersonDto
{
    public String Id { getset; }
    public String Name { getset; }
    public Int32 Age { getset; }
}

那我们在代码例如如何把其中一个类Person的对象映射为PersonDto呢?看看Tiny Mapper的使用,很简单就2行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/// <summary>最简单的2个类型之间的映射</summary>
static void Test1()
{
    TinyMapper.Bind<Person,PersonDto>();
    //实例化一个Person对象
    var person = new Person
    {
        Id = Guid.NewGuid().ToString(),
        Name = "John",
        Age = 22
    };  
    //映射
    var personDto = TinyMapper.Map<PersonDto>(person);
}

运行看看结果:

3.Tiny Mapper 指定配置使用

有时候对象的字段名称并不一样,而且可能要忽略某些字段,这个时候就要使用更加灵活的配置了。

看例子,为了演示,我们特意修改2个类型的字段名称不一样.如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Person
{
    public String Id { getset; }
    public String Name { getset; }
    public Int32 Age { getset; }
     
}
public class PersonDto
{
    public String Id { getset; }
    //注意这里的字段名称:UserName
    public String UserName { getset; }
    public Int32 Age { getset; }   
}

映射代码和配置如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/// <summary>使用配置项指定和忽略字段</summary>
static void Test2()
{
    TinyMapper.Bind<Person, PersonDto>(config =>
    {
        config.Ignore(x => x.Id);//忽略ID字段
        config.Bind(x => x.Name, y => y.UserName);//将源类型和目标类型的字段对应绑定起来
        config.Bind(x => x.Age, y => y.Age);//将源类型和目标类型的字段对应绑定起来
    });
    var person = new Person
    {
        Id = Guid.NewGuid().ToString(),
        Name = "John",
        Age = 22
    };
    var personDto = TinyMapper.Map<PersonDto>(person);
}

看看效果如何?我们指定的Id字段忽略映射,以及将源对象的字段映射到目标对象的指定字段了:

4.Tiny Mapper复杂类型使用

有时候对象的类型里面嵌套着对象,或者数组等等,其实这个时候的使用和上述完全一样,这里只是举个例子,大家看看而已:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Person
{
    public String Id { getset; }
    public String Name { getset; }
    public Int32 Age { getset; }
    public Address Address { getset; }
    public List<String> Emails { getset; }
}
public class PersonDto
{
    public String Id { getset; }
    public String UserName { getset; }
    public Int32 Age { getset; }
    public Address Address { getset; }
    public List<String> Emails { getset; }
}
public sealed class Address
{
    public string Phone { getset; }
    public string Street { getset; }
    public string ZipCode { getset; }
}

映射的代码和第3节类似:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/// <summary>更复杂对象的映射例子</summary>
static void Test3()
{
    TinyMapper.Bind<Person, PersonDto>(config =>
    {
        config.Ignore(x => x.Id);//忽略ID字段
 
        //将源类型和目标类型的字段对应绑定起来
        config.Bind(x => x.Name, y => y.UserName);
        config.Bind(x => x.Age, y => y.Age);
        config.Bind(x => x.Address, y => y.Address);
        config.Bind(x => x.Emails, y => y.Emails);
    });
    var person = new Person
    {
        Id = Guid.NewGuid().ToString(),
        Name = "John",
        Age = 22,
        Address = new Address() { Phone = "1880393", Street = "Shanghai", ZipCode = "121212" },
        Emails = new List<string>() { "aaa@bb.com""acx@cc.com" }
    };
    var personDto = TinyMapper.Map<PersonDto>(person);
}

效果如下:

5.资源

Tiny Mapper官方网站:http://tinymapper.net/

github项目地址:https://github.com/TinyMapper/TinyMapper

本文使用的代码下载:TinyMapperDemo.rar

Tiny Mapper是一个.net平台开源的对象映射组件的更多相关文章

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

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

  2. .NET平台开源项目速览-最快的对象映射组件Tiny Mapper之项目实践

    心情小札:近期换了工作,苦逼于22:00后下班,房间一篇狼藉~ 小翠鄙视到:"你就适合生活在垃圾堆中!!!" 晚上浏览博客园 看到一篇非常实用的博客:.NET平台开源项目速览(14 ...

  3. 对象映射组件Tiny Mapper

    1.Tiny Mapper的简单实用例子 using System; using System.Collections.Generic; using System.Linq; using System ...

  4. 分享一个.NET平台开源免费跨平台的大数据分析框架.NET for Apache Spark

    今天早上六点半左右微信群里就看到张队发的关于.NET Spark大数据的链接https://devblogs.microsoft.com/dotnet/introducing-net-for-apac ...

  5. Tiny Mapper

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

  6. .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做 ...

  7. 这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)

    在前2篇文章这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧 和这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,大伙热情高涨.再次拿出自己的私货,在.NET平台 ...

  8. .NET平台开源文档与报表处理组件包括Execel PDF Word等

    在前2篇文章这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧 和这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,大伙热情高涨.再次拿出自己的私货,在.NET平台 ...

  9. Composite C1是一个.Net平台上开源专业的CMS开源项目

    CompositeC1 4 发布 Composite C1是一个.Net平台上开源专业的CMS开源项目,很多的功能用户界面,面向任务的支持与各种工具协作.当编辑内容时在用户端体验很友好.编辑器与开发者 ...

随机推荐

  1. poj1573&amp;&amp;hdu1035 Robot Motion(模拟)

    转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接: HDU:pid=1035">http://acm.hd ...

  2. MSSQL - 创建新用户

    1.首先使用Windows身份验证登陆. 2.然后一次打开:安全性--->登录名.右键登录名,点击新建登录名. 3.常规选项卡下:填写登录名.选择SQL Server身份验证,填写登录名密码.取 ...

  3. OCP-1Z0-042-V12.39-51题

    51.Which two statements regarding archive log destinations are true? 题目解析: A(正确)因为:.归档日志最多可以配置10个 B和 ...

  4. Qt5窗口设计

    主窗口设计通常是应用程序界面设计的第一步,主窗口主要分为窗口标题,菜单栏,工具栏和状态栏这四个部分,只要在程序设计中分别对四个项目进行设计就可以实现主窗口的编程了.在下面的例子中,我们就以一个打开文件 ...

  5. C# c++ 传递函数指针

    C#和c++之间相互传递函数指针 在C++和C#之中都有很多callback method,可以相互调用吗,怎么传递,是我表弟的问题. 1.定义c++ dll ,导出方法 // sort.cpp : ...

  6. mysql数据导出权限问题

    mysql数据导出的方法有非常多,比如mysqldump, mysql -e 'sql' > file, 这些都能够非常方便的导出数据,但是在使用普通用户导出数据的时候,出现了问题. 1 sel ...

  7. lua 与 php 通过AES数据加密进行通讯

    近期公司有款<围住神经猫>的微信小游戏火爆的不行!公司又决定开发一系列的神经猫的小游戏,于是,我被拉过来了. 后来使用cocos-2dx 开发一款小游戏,client用的是lua脚本,为了 ...

  8. VS2008通过 map 和 cod 文件定位崩溃代码行

    VS 2005/2008使用map文件查找程序崩溃原因 一般程序崩溃可以通过debug,找到程序在那一行代码崩溃了,最近编一个多线程的程序,都不知道在那发生错误,多线程并发,又不好单行调试,终于找到一 ...

  9. ANDROID自定义视图——onMeasure流程,MeasureSpec详解

    简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局——onLayout():决定View在ViewGroup中的位置 3. ...

  10. EasyUI - Draggable 拖动控件

    效果: html代码: <div id="box" style="width: 400px; height: 200px; background-color: #f ...