zoukankan      html  css  js  c++  java
  • .NET平台开源项目速览-最快的对象映射组件Tiny Mapper之项目实践

    心情小札:近期换了工作,苦逼于22:00后下班,房间一篇狼藉~ 小翠鄙视到:"你就适合生活在垃圾堆中!!!"

    晚上浏览博客园 看到一篇非常实用的博客:.NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper,花了10分钟简单了解了一下。

    看评论也是挺有价值,同时也看到许多新手同学问道在实际项目中使用的情况。

    下面就原作者的代码的基础上略作调整,阐述一下在实际项目场景中的使用:

    第一步:了解类库方法:TinyMapper 主要有两个函数:

       TinyMapper.Bind<T1, T2>();//绑定映射关系

       TinyMapper.Map<T>(obj);//从对象获取想要的对象

    第二步:初始化Mapping设置

     说明:类似的Mapping设置无非两种模式:代码静态对象初始化模式,xml配置模式,很荣幸TinyMapper支持的是静态字典。

    public static class TinyMapContext
        {
            public static void InitMapping()
            {
                TinyMapper.Bind<Person, PersonDto>();
                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);//将源类型和目标类型的字段对应绑定起来
                });
    
                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);
                });
    
                TinyMapper.Bind<PersonDto,Person>();
                TinyMapper.Bind<PersonDto,Person>(config =>
                {
                    config.Bind(x => x.Id,y=>y.Id);
                    config.Bind(x => x.UserName, y => y.Name);
                    config.Bind(x => x.Age, y => y.Age);
                });
    
                TinyMapper.Bind<PersonDto,Person>(config =>
                {
                    config.Bind(x => x.Id,y=>y.Id);//忽略ID字段
                    //将源类型和目标类型的字段对应绑定起来
                    config.Bind(x =>x.UserName,y=> y.Name);
                    config.Bind(x => x.Age, y => y.Age);
                    config.Bind(x => x.Address, y => y.Address);
                    config.Bind(x => x.Emails, y => y.Emails);
                });
    
            }
            public static T GetMapObject<T>(object obj) where T:class
            {
               return TinyMapper.Map<T>(obj);
            }
        }

    说明:以上mapping映射中,针对于原作者的代码,额外添加了:由PersonDto=》Person的映射关系。

       T GetMapObject<T>(object obj) where T:class 的作用会在后面的代码中体现出来。 简单一个方法,威力不可小嘘~~

    第三步:DtoModel -》Model

     从数据库模型映射到领域模型:

      var p = TinyMapContext.GetMapObject<Person>(personDto); 

    第四步:Model-》DtoModel

     从领域模型到数据库模型:

     var personDto = TinyMapContext.GetMapObject<PersonDto>(person);

    第五步:List<Model>=>List<DtoModel> 或者List<DtoModel>=>List<Model>

            /// <summary>
            /// 测试列表对象。
            /// </summary>
            static void Test4()
            {
                List<Person> personList = new List<Person>(){
                new Person
                {
                    Id = Guid.NewGuid().ToString(),
                    Name = "John1",
                    Age = 22,
                    Address = new Address() { Phone = "1880393", Street = "Shanghai", ZipCode = "121212" },
                    Emails = new List<string>() { "aaa@bb.com", "acx@cc.com" }
                },
                new Person
                {
                    Id = Guid.NewGuid().ToString(),
                    Name = "John2",
                    Age = 22,
                    Address = new Address() { Phone = "1880393", Street = "Shanghai", ZipCode = "121212" },
                    Emails = new List<string>() { "aaa@bb.com", "acx@cc.com" }
                },
                  new Person
                {
                    Id = Guid.NewGuid().ToString(),
                    Name = "John3",
                    Age = 22,
                    Address = new Address() { Phone = "1880393", Street = "Shanghai", ZipCode = "121212" },
                    Emails = new List<string>() { "aaa@bb.com", "acx@cc.com" }
                },
                  new Person
                {
                    Id = Guid.NewGuid().ToString(),
                    Name = "John4",
                    Age = 22,
                    Address = new Address() { Phone = "1880393", Street = "Shanghai", ZipCode = "121212" },
                    Emails = new List<string>() { "aaa@bb.com", "acx@cc.com" }
                }
                };
    
    
                var personDtoList = TinyMapContext.GetMapObject<List<PersonDto>>(personList);
                foreach (var item in personDtoList)
                {
                    DebugOutputUtil.DebugOutput(item.UserName);
                }
    
    
                var pList = TinyMapContext.GetMapObject<List<Person>>(personDtoList);
                foreach (var item in pList)
                {
                    DebugOutputUtil.DebugOutput(item.Name);
                }
            }

    特别说明:对于获取列表类型的对象,不需要在静态初始化映射中额外添加 IList类型的对象。 TinyMapper会自动按照"映射过的基础类型"动态的帮你获取想要的数据。

    本文的代码:示例

    说明:代码浅显易懂,然人非完人,编码不规范的地方、手误、或代码存在缺陷、或严重性能问题,希望园友们批评指正。

  • 相关阅读:
    画笔
    进程和线程<二>
    进程和线程<一>
    文件<2>
    文件<1>
    窗口(3)
    窗口<二>
    窗口(1)
    消息
    位图
  • 原文地址:https://www.cnblogs.com/cdemo/p/5457065.html
Copyright © 2011-2022 走看看