zoukankan      html  css  js  c++  java
  • automapper demo

      最近做项目,需要把DataTable中的数据强类型化.于是试用了下比较常用的AutoMapper,通过看代码中附带的Demo与网上的教程,也算能够勉强使用了,现将学习笔记记录如下:

    复制代码

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                //1.普通转换
                Name name1 = new Name() { FirstName = "L", LastName = "jz" };
                Mapper.CreateMap<Name, NameDto>()
                    .BeforeMap((name, nameDto) => Console.WriteLine("hello world before"))
                    .AfterMap((name, nameDto) => Console.WriteLine("hello world after"));
                NameDto nameDto1 = Mapper.Map<Name, NameDto>(name1);
                Console.WriteLine("1");
                Console.WriteLine(nameDto1.FirstName + nameDto1.LastName);
                Console.WriteLine();
                //Console.ReadKey();

                //整体设置
                //2.整体即时转换
                Mapper.Reset();
                Name name2 = new Name() { FirstName = "L", LastName = "jz" };
                Mapper.CreateMap<Name, NameDto>()
                    .ConstructUsing(name => new NameDto() { AllName = name.FirstName + name.LastName });
                NameDto nameDto2 = Mapper.Map<Name, NameDto>(name2);
                Console.WriteLine("2");
                Console.WriteLine(nameDto2.AllName);
                Console.WriteLine();
                //Console.ReadKey();

                //3.整体通过TypeConverter类型转换
                Mapper.Reset();
                Name name3 = new Name() { FirstName = "L", LastName = "jz" };
                Mapper.CreateMap<Name, NameDto>()
                    .ConvertUsing<NameConverter>();
                NameDto nameDto3 = Mapper.Map<Name, NameDto>(name3);
                Console.WriteLine("3");
                Console.WriteLine(nameDto3.AllName);
                Console.WriteLine();
                //Console.ReadKey();

                //单属性设置
                //4.属性条件转换
                Mapper.Reset();
                Name name4 = new Name() { FirstName = "L", LastName = "jz" };
                Mapper.CreateMap<Name, NameDto>()
                    .ForMember(name => name.FirstName, opt => opt.Condition(name => !name.FirstName.Equals("l", StringComparison.OrdinalIgnoreCase)));
                NameDto nameDto4 = Mapper.Map<Name, NameDto>(name4);
                Console.WriteLine("4");
                Console.WriteLine(string.IsNullOrEmpty(nameDto4.FirstName));
                Console.WriteLine();
                //Console.ReadKey();

                //5.属性忽略
                Mapper.Reset();
                Name name5 = new Name() { FirstName = "L", LastName = "jz" };
                Mapper.CreateMap<Name, NameDto>()
                    .ForMember(name => name.FirstName, opt => opt.Ignore());
                NameDto nameDto5 = Mapper.Map<Name, NameDto>(name5);
                Console.WriteLine("5");
                Console.WriteLine(string.IsNullOrEmpty(nameDto5.FirstName));
                Console.WriteLine();
                //Console.ReadKey();

                //6.属性转换
                Mapper.Reset();
                Name name6 = new Name() { FirstName = "L", LastName = "jz" };
                Mapper.CreateMap<Name, NameDto>()
                    .ForMember(name => name.AllName, opt => opt.MapFrom(name => name.FirstName + name.LastName));
                NameDto nameDto6 = Mapper.Map<Name, NameDto>(name6);
                Console.WriteLine("6");
                Console.WriteLine(nameDto6.AllName);
                Console.WriteLine();
                //Console.ReadKey();

                //7.属性通过ValueResolver转换
                Mapper.Reset();
                Name name7 = new Name() { FirstName = "L", LastName = "jz" };
                Mapper.CreateMap<Name, StoreDto>()
                    .ForMember(storeDto => storeDto.Name, opt => opt.ResolveUsing<NameResolver>());
                StoreDto store1 = Mapper.Map<Name, StoreDto>(name7);
                Console.WriteLine("7");
                Console.WriteLine(store1.Name.FirstName + store1.Name.LastName);
                Console.WriteLine();
                //Console.ReadKey();

                //8.属性填充固定值
                Mapper.Reset();
                Name name8 = new Name() { FirstName = "L", LastName = "jz" };
                Mapper.CreateMap<Name, NameDto>()
                    .ForMember(name => name.AllName, opt => opt.UseValue<string>("ljzforever"));
                NameDto nameDto8 = Mapper.Map<Name, NameDto>(name8);
                Console.WriteLine("8");
                Console.WriteLine(nameDto8.AllName);
                Console.WriteLine();
                //Console.ReadKey();

                //9.属性格式化
                Mapper.Reset();
                Name name9 = new Name() { FirstName = "L", LastName = "jz" };
                Mapper.CreateMap<Name, NameDto>()
                    .ForMember(name => name.FirstName, opt => opt.AddFormatter<StringFormatter>());
                NameDto nameDto9 = Mapper.Map<Name, NameDto>(name9);
                Console.WriteLine("9");
                Console.WriteLine(nameDto9.FirstName);
                Console.WriteLine();
                //Console.ReadKey();

                //10.属性null时的默认值
                Mapper.Reset();
                Name name10 = new Name() { FirstName = "L" };
                Mapper.CreateMap<Name, NameDto>()
                    .ForMember(name => name.LastName, opt => opt.NullSubstitute("jz"));
                NameDto nameDto10 = Mapper.Map<Name, NameDto>(name10);
                Console.WriteLine("10");
                Console.WriteLine(nameDto10.LastName);
                Console.WriteLine();
                //Console.ReadKey();

                //其它设置与特性
                //11.转换匿名对象
                Mapper.Reset();
                object name11 = new { FirstName = "L", LastName = "jz" };
                NameDto nameDto11 = Mapper.DynamicMap<NameDto>(name11);
                Console.WriteLine("11");
                Console.WriteLine(nameDto11.FirstName + nameDto11.LastName);
                Console.WriteLine();
                //Console.ReadKey();

                //12.转换DataTable
                Mapper.Reset();
                DataTable dt = new DataTable();
                dt.Columns.Add("FirstName", typeof(string));
                dt.Columns.Add("LastName", typeof(string));
                dt.Rows.Add("L", "jz");
                List<NameDto> nameDto12 = Mapper.DynamicMap<IDataReader, List<NameDto>>(dt.CreateDataReader());
                Console.WriteLine("12");
                Console.WriteLine(nameDto12[0].FirstName + nameDto12[0].LastName);
                Console.WriteLine();
                //Console.ReadKey();
                //emitMapper error
                //List<NameDto> nameDto20 = EmitMapper.ObjectMapperManager.DefaultInstance.GetMapper<IDataReader, List<NameDto>>().Map(dt.CreateDataReader());


                //13.转化存在的对象
                Mapper.Reset();
                Mapper.CreateMap<Name, NameDto>()
                    .ForMember(name => name.LastName, opt => opt.Ignore());
                Name name13 = new Name() { FirstName = "L" };
                NameDto nameDto13 = new NameDto() { LastName = "jz" };
                Mapper.Map<Name, NameDto>(name13, nameDto13);
                //nameDto13 = Mapper.Map<Name, NameDto>(name13);//注意,必需使用上面的写法,不然nameDto13对象的LastName属性会被覆盖
                Console.WriteLine("13");
                Console.WriteLine(nameDto13.FirstName + nameDto13.LastName);
                Console.WriteLine();
                //Console.ReadKey();

                //14.Flatten特性
                Mapper.Reset();
                Mapper.CreateMap<Store, FlattenName>();
                Store store2 = new Store() { Name = new Name() { FirstName = "L", LastName = "jz" } };
                FlattenName nameDto14 = Mapper.Map<Store, FlattenName>(store2);
                Console.WriteLine("14");
                Console.WriteLine(nameDto14.NameFirstname + nameDto14.NameLastName);
                Console.WriteLine();
                //Console.ReadKey();

                //15.将Dictionary转化为对象,现在还不支持
                Mapper.Reset();
                Mapper.CreateMap<Dictionary<string, object>, Name>();
                Dictionary<string, object> dict = new Dictionary<string, object>();
                dict.Add("FirstName", "L");
                //Name name15 = Mapper.DynamicMap<Dictionary<string, object>, Name>(dict);
                Name name15 = Mapper.Map<Dictionary<string, object>, Name>(dict);
                Console.WriteLine("15");
                Console.WriteLine(name15.FirstName);
                Console.WriteLine();
                Console.ReadKey();
            }
        }

        
        public class Store
        {
            public Name Name { get; set; }
            public int Age { get; set; }
        }

        public class Name
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
        }

        public class StoreDto
        {
            public NameDto Name { get; set; }
            public int Age { get; set; }
        }

        public class NameDto
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string AllName { get; set; }
        }

        public class FlattenName
        {
            public string NameFirstname { get; set; }
            public string NameLastName { get; set; }
        }

        public class NameConverter : TypeConverter<Name, NameDto>
        {
            protected override NameDto ConvertCore(Name source)
            {
                return new NameDto() { AllName = source.FirstName + source.LastName };
            }
        }

        public class NameResolver : ValueResolver<Name, NameDto>
        {
            protected override NameDto ResolveCore(Name source)
            {
                return new NameDto() { FirstName = source.FirstName, LastName = source.LastName };
            }
        }

        public class NameFormatter : ValueFormatter<NameDto>
        {
            protected override string FormatValueCore(NameDto name)
            {
                return name.FirstName + name.LastName;
            }
        }

        public class StringFormatter : ValueFormatter<string>
        {
            protected override string FormatValueCore(string name)
            {
                return name + "-";
            }
        }
    }
    复制代码

          比较遗憾的是现在还不支持将Directory转化为对象

          参考的文章:

      1. 使用AutoMapper实现Dto和Model的自由转换
      2. AutoMapper使用笔记
      3. 博客园现代化建设——AutoMapper
      4. EmitMapper,AutoMapper,NLiteMapper和手工映射性能大比拼
      5. Can Automapper map from a Dictionary of properties to a flat destination?
  • 相关阅读:
    css文字换行问题white-space:pre-line或者white-space:pre-wrap,解决word-wrap:break-word解决不了的
    ie浏览器检测不到cookie的问题
    jQuery ajax在IE浏览器的跨域问题--jquery.xdomainrequest.min.js
    移动端 input 获取焦点后弹出带搜索、确定、前往的键盘,以及隐藏系统键盘
    三个获取浏览器URL中参数值的方法
    上传文件时文件类型限制 <input id="File1" type="file" accept=""/>
    ES6 let和const 的相同点与区别
    html页面中的title设置为空格
    vue 之 key
    nginx 之 proxy_pass详解
  • 原文地址:https://www.cnblogs.com/tomahawk/p/4495019.html
Copyright © 2011-2022 走看看