Auto Mapper02《demo》

摘要:
“高内聚低耦合,尽量依赖抽象而不依赖于具体”,这个在面向对象的开发中是很常见的,autoMapper就可以很好的解释这个。书类//书店publicclassBookStore{publicstringName{get;set;}publicListBooks{get;set;}publicAddressAddress{get;set;}}//书店的地址publicclassAddress{publicstringCountry{get;set;}publicstringCity{get;set;}publicstringStreet{get;set;}publicstringPostCode{get;set;}}//书类publicclassBook{publicstringTitle{get;set;}publicstringDescription{get;set;}publicstringLauguage{get;set;}publicdecimalPrice{get;set;}publicDateTime?Paperback{get;set;}//01作者信息publicstringFirstAuthorName{get;set;}publicstringFirstAuthorDescription{get;set;}publicstringFirstAuthorEmail{get;set;}publicstringFirstAuthorBlog{get;set;}publicstringFirstAuthorTwitter{get;set;}//02作者信息publicstringSecondAuthorName{get;set;}publicstringSecondAuthorDescription{get;set;}publicstringSecondAuthorEmail{get;set;}publicstringSecondAuthorBlog{get;set;}publicstringSecondAuthorTwitter{get;set;}}我们可以发现dto里面将book的整个层级结构,全面拉平了,就是说放到了一个类里面,其实我们强大的AutoMapper是可以自动的进行映射的,还有我们的名字不一样的,但是只要是后面的是一样的是可以映射的。AutoMapper利用ForMember来指定每一个字段的映射规则的。

学习这些基本上网上都有一些教程或者别人做的demo,我是按照这个方式去学习的。先做个demo,学会如何去使用它,接着去慢慢的了解它是如何的运行的,理解里面的一些基本的基础知识。我们不可以再像学校里面的那样,先去学习基本的结构,那样我们会很烦脑的,我们应该先学会使用它,接着再去慢慢的了解。

“高内聚低耦合,尽量依赖抽象而不依赖于具体”,这个在面向对象的开发中是很常见的,autoMapper就可以很好的解释这个。automapper具体的功能就是将数据库中的实体表转换为我们页面上使用的model,虽然我们可以直接使用实体的Model,但是我们为了以后着想,界面上使用我们自己定义的Modell,只需要我们利用automapper进行转换就可以了。因为我们的实体Model是最容易发生变化的。

image

下面是我安装网上的教程做的demo。

书类

  //书店
    public class BookStore
    {
        public string Name { get; set; }
        public List<Book> Books { get; set; }
        public Address Address { 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 Lauguage { 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; }
    }
    //每本书都有2个作者
    public class Author
    {
        public string Name { get; set; }
        public string Description { get; set; }
        public ContactInfo ContactInfo { get; set; }
    }
    //联系法式
    public class ContactInfo
    {
        public string Email { get; set; }
        public string Blog { get; set; }
        public string Twitter { get; set; }
    }

书Dto

    //书店
    public class BookStoreDto
    {
        public string Name { get; set; }
        public List<BookDto> Books { get; set; }
        public AddressDto Address { 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; }
    }
    //这个是对应的Book类
    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; }  
        //01作者信息
        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; }  
        //02作者信息
        public string SecondAuthorName { get; set; }  
        public string SecondAuthorDescription { get; set; }  
        public string SecondAuthorEmail { get; set; }  
        public string SecondAuthorBlog { get; set; }  
       public string SecondAuthorTwitter { get; set; }  
    }

我们可以发现dto里面将book的整个层级结构 ,全面拉平了,就是说放到了一个类里面,其实我们强大的AutoMapper是可以自动的进行映射的,还有我们的名字不一样的,但是只要是后面的是一样的是可以映射的。

            //Mapper.CreateMap<AddressDto, Address>();
            AddressDto dto=new AddressDto()
            {
                Country = "China",
                City = "XiAn",
                Street = "YUlin",
                PostCode = "001"
            };
            //配置二者的转换
            Mapper.CreateMap<AddressDto, Address>();
            //这个映射的时候是从左向右的
            Address address = Mapper.Map<AddressDto,Address>(dto);
            Console.WriteLine(address.Country);
            Console.WriteLine(address.PostCode);
            Console.ReadKey();

规则:

1:若是一个里面有空属性,那么利用AutoMapper映射过去相应的属性就会为空。

2:可以进行手工的传递。直接就是DTO中的一个属性可以直接映射到Modle中的一个类,但是需要我们自己进行设置。AutoMapper利用ForMember来指定每一个字段的映射规则的。

Mapper.CreateMap<Blog, Model>().ForMember(x => x.BlogCon, mo => mo.MapFrom(x => x.BlogContext));

bookDto的转换

            //集合初始化器
            BookStoreDto dto=new BookStoreDto()
            {
                Name = "ahui",
                Address = new AddressDto
                {
                    City = "YUlin"
                },
                Books = new List<BookDto>
                {
                    new BookDto
                    {
                        Title = "你好世界"
                    },
                    new BookDto
                    {
                        Title = "世界你好"
                    }
                }
            };
            //配置,这里要将转换的内容全部进行配置
            Mapper.CreateMap<BookStoreDto, BookStore>();
            Mapper.CreateMap<AddressDto, Address>();
            Mapper.CreateMap<BookDto, Book>();
            //IMappingExpression<BookDto, Book> expression = Mapper.CreateMap<BookDto, Book>();
            //转换
            BookStore bookStore = Mapper.Map<BookStoreDto,BookStore>(dto);            
            //利用bookStore输出
            Console.WriteLine(bookStore.Address.Country);
            Console.WriteLine(bookStore.Name);
            foreach (var item in bookStore.Books)
            {
                Console.WriteLine(item.Title);                
            }
            Console.ReadKey();

image

这样就成功了。

3:autoMapper中的ConstructUsing。

我们想一次性的定义好所有的字段,我们就可以使用ConstructUsing来操作。

   //配置  这里还是说将名称不同的变量之间进行映射。
            //定义BookDto到第一作者(Author)的ContactInfo之间的映射。
            var map = Mapper.CreateMap<BookDto,ContactInfo>();
            map.ConstructUsing(s=>new ContactInfo
            {
                Blog = s.FirstAuthorBlog,
                Email = s.FirstAuthorEmail,
                Twitter=s.FirstAuthorTwitter
            });
            //转换
            BookDto dto=new BookDto()
            {                
                FirstAuthorEmail = "1193451014@qq.com",
                FirstAuthorBlog="www.cnblogs.com/netxiaohui",                  
            };
            ContactInfo contactInfo = Mapper.Map<ContactInfo>(dto);
            Console.WriteLine(contactInfo.Blog);
            Console.WriteLine(contactInfo.Email);
            Console.ReadKey();

image

4:验证配置是否有效,无效的话会抛出异常的,。

            Mapper.AssertConfigurationIsValid();

这里的抛出异常(AutoMapperConfigurationException),我们别小看它,在他执行期间,AutoMapper会检查每个目标类型的属性,一对一的去匹配源中是否存在合适相等的类型。

5:使用忽略选项(Ignore())

情景:目标类型有个成员,不能完成转换,我们不想让其转换,可以这样配置。

            //我们不想再转换的时候将Book的Title进行转换,可以将其忽略
            Mapper.CreateMap<BookDto, Book>().ForMember(dest=>dest.Title,opt=>opt.Ignore());

错误:出现了和上次一样的错误。

“{"Missing type map configuration or unsupported mapping. Mapping types: BookStoreDto -> BookStore AMapper.Class.BookStoreDto -> AMapper.Class.BookStore Destination path: BookStore Source value: AMapper.Class.BookStoreDto"}”

这个就是没有进行配置,就是说AutoMapper不知道你要如何去转换,后来才发现我写反了,应该先进行配置在转换。

image

就是错在了这里。

附件

“呆河马” http://www.cnblogs.com/jobs2/p/3503990.html

“魔古先生” http://www.cnblogs.com/mushroom/p/4291975.html

免责声明:文章转载自《Auto Mapper02《demo》》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇stream().findAny().orElse(nullopenssl enc 加解密下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信关注后自动回复,根据关键字回复

packageme.chunyu.apps.weixin.controller; importjava.io.IOException; importjava.net.URLEncoder; importjava.text.SimpleDateFormat; importjava.util.ArrayList; importjava.util.Ha...

关于Intege.valueOf()的使用

原文链接:https://blog.csdn.net/weixin_37650458/article/details/85212730 1.Integer. valueOf()方法的作用     Integer. valueOf()可以将基本类型int转换为包装类型Integer,或者将String转换成Integer,String如果为Null或“”都会...

JavaWeb — 添加学生信息(网页版)

eclipse+MySQL实现 一、前端部分,通过编写jsp实现添加页面: add.jsp <%@ page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <hea...

在Android里完美实现基站和WIFI定位

来自:http://www.cnblogs.com/coffeegg/archive/2011/10/01/2197129.html 众所周知的,在OPhone和大部分国产的Android定制机里不支持最简单实用的基站和WIFI定位,只能使用速度慢而耗电的GPS定位,但OPhone和华为/中兴生产的一些Android定制机却占据了一定的市场,因此导致了...

JSF: 动态生成的DataTable, 固定表头, 固定行标

自己写了段小代码, 希望可以供大家学习和参考。 代码里没有太多注释, 有时间的话我会补充上去。自己在写动态生成DataTable的时候也查阅了很多相关文章, 以及实现固定表头等等。在解决固定表头问题上我是用的两张表(加行标是3张表)实现的, 因为我发现如果用JSF1.1的化实现固定表头几乎不可能(如果有人有好的想法, 比如用JS比较在行的朋友请告诉我解决方...

【easycode】使用说明 &amp;amp; 示例

语法 ## 是模板的注释,不会生成 # 全局的一些设置 $ 使用库函数或者调用全局定义的内容 常用方法 数据库表信息 ${tableInfo} comment 表备注 name 表名 fullColumn 所有列 comment 列备注 name 列名称 type 列类型 pkColumn 主键列 otherColumn 其...