zoukankan      html  css  js  c++  java
  • AutoMapper在MVC中的运用06-一次性定义映射、复杂类型属性映射

    本篇AutoMapper使用场景:

    ※ 当源和目标具有同名的复杂类型属性、集合类型属性,这2种属性对应的类间也需建立映射

    ※ 一次性定义好源和目标的所有映射

    ※ 一次性定义好源和目标的所有映射,目标中有复杂类型属性

    ※ 一次性定义好源和目标的所有映射,目标中有复杂类型属性,为复杂类型创建自定义解析器


    □ Domain model


        public class BookStore

        {

            public string Name { get; set; }

            public Address Address { get; set; }

            public List<Book> Books { get; set; }

        }


        public class Address

        {

            public string Country { get; set; }

            public string City { get; set; }

            public string Street { get; set; }

            public string PostCode { get; set; }

        }


        public class Book

        {

            public string Title { get; set; }

            public string Description { get; set; }

            public string Language { get; set; }

            public decimal Price { get; set; }

            public DateTime? PublishDate { get; set; }

            public Publisher Publisher { get; set; }

            public int? Paperback { get; set; }

            public List<Author> Authors { get; set; }

        }


        public class Publisher

        {

            public string Name { get; set; }

        }


        public class Author

        {

            public string Name { get; set; }

            public string Description { get; set; }

            public ContanctInfo ContactIfno { get; set; }

        }


        public class ContanctInfo

        {

            public string Email { get; set; }

            public string Blog { get; set; }

            public string Twitter { get; set; }

        } 



    □ View model


        public class BookStoreDto

        {

            public string Name { get; set; }

            public AddressDto Address { get; set; }

            public List<BookDto> Books { get; set; }


        }


        public class AddressDto

        {

            public string Country { get; set; }

            public string City { get; set; }

            public string Street { get; set; }

            public string PostCode { get; set; }

        }


        public class BookDto

        {

            public string Title { get; set; }

            public string Description { get; set; }

            public string Language { get; set; }

            public decimal Price { get; set; }

            public DateTime? PublishDate { get; set; }

            public string Publisher { get; set; }

            public int? Paperback { get; set; }

            public string FirstAuthorName { get; set; }

            public string FirstAuthorDescription { get; set; }

            public string FirstAuthorEmail { get; set; }

            public string FirstAuthorBlog { get; set; }

            public string FirstAuthorTwitter { get; set; }

            public string SecondAuthorName { get; set; }

            public string SecondAuthorDescription { get; set; }

            public string SecondAuthorEmail { get; set; }

            public string SecondAuthroBlog { get; set; }

            public string SecondAuthorTwitter { get; set; }


        }    



      当源和目标具有同名的复杂类型属性、集合类型属性,这2种属性对应的类间也需建立映射


                Mapper.CreateMap<BookStoreDto, BookStore>();

                Mapper.CreateMap<AddressDto, Address>();

                Mapper.CreateMap<BookDto, Book>();

                BookStore bookStore = Mapper.Map<BookStoreDto, BookStore>(bookStoreDto);


      一次性定义好源和目标的所有映射


                Mapper.CreateMap<BookDto, ContanctInfo>()

                    .ConstructUsing(s => new ContanctInfo //第一个参数为源

                    {

                        Blog = s.FirstAuthorBlog,

                        Email = s.FirstAuthorEmail,

                        Twitter = s.FirstAuthorTwitter

                    });

                ContanctInfo contactInfo = Mapper.Map<BookDto, ContanctInfo>(bookDto);



      一次性定义好源和目标的所有映射,目标中有复杂类型属性


                Mapper.CreateMap<BookDto, Author>()

                    .ConstructUsing(s => new Author

                    {

                        Name = s.FirstAuthorName,

                        Description = s.FirstAuthorDescription,

                        ContactIfno = new ContanctInfo { 

                            Blog = s.FirstAuthorBlog,

                            Email = s.FirstAuthorEmail,

                            Twitter = s.FirstAuthorTwitter

                        }

                    });

                Author author = Mapper.Map<BookDto, Author>(bookDto); //间接得到了ContactInfo


      一次性定义好源和目标的所有映射,目标中有复杂类型属性,为复杂类型创建自定义解析器



                Mapper.CreateMap<BookDto, Author>()

                    .ForMember(d => d.Name, opt => opt.MapFrom(s => s.FirstAuthorName))

                    .ForMember(d => d.Description, opt => opt.MapFrom(s => s.FirstAuthorDescription))

                    .ForMember(d => d.ContactIfno, opt => opt.ResolveUsing<FirstAuthorContactInfoResolver>());

                Author author = Mapper.Map<BookDto, Author>(bookDto); //间接得到了ContactInfo


    □ 自定义解析器


        public class FirstAuthorContactInfoResolver : ValueResolver<BookDto, ContanctInfo>

        {

            protected override ContanctInfo ResolveCore(BookDto source)

            {

                return Mapper.Map<BookDto, ContanctInfo>(source);

            }

        }     


  • 相关阅读:
    《梦断代码》阅读笔记01
    linux c netcdf 安装
    Windows CE中的进程和线程
    VC做任务管理器涉及到的函数
    curl_easy_getinfo() -- 从 curl 句柄里获得附加信息
    libcurl programming
    动态内存申请函数选择(realloc、malloc 、alloca、 calloc)
    C++: byte和int的相互转化
    8位灰度图像BMP的保存
    BMP图像的结构及读写和灰度化
  • 原文地址:https://www.cnblogs.com/darrenji/p/3570492.html
Copyright © 2011-2022 走看看