AutoMapper简明教程(学习笔记)

AutoMapper简明教程(学习笔记)

       最近做项目,需要把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< stringobject>, Name>();
            Dictionary< stringobject> dict =  new Dictionary< stringobject>();
            dict.Add( " FirstName "" L ");
             // Name name15 = Mapper.DynamicMap<Dictionary<string, object>, Name>(dict);
            Name name15 = Mapper.Map<Dictionary< stringobject>, Name>(dict);
            Console.WriteLine( " 15 ");
            Console.WriteLine(name15.FirstName);
            Console.WriteLine();
            Console.ReadKey();
        }
    }

    
     public  class Store
    {
         public Name Name {  getset; }
         public  int Age {  getset; }
    }

     public  class Name
    {
         public  string FirstName {  getset; }
         public  string LastName {  getset; }
    }

     public  class StoreDto
    {
         public NameDto Name {  getset; }
         public  int Age {  getset; }
    }

     public  class NameDto
    {
         public  string FirstName {  getset; }
         public  string LastName {  getset; }
         public  string AllName {  getset; }
    }

     public  class FlattenName
    {
         public  string NameFirstname {  getset; }
         public  string NameLastName {  getset; }
    }

     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. 6
    原文地址:http://www.cnblogs.com/ljzforever/archive/2011/12/29/2305500.html

你可能感兴趣的:(mapper)