Auto Mapper02《demo》

简介: Auto Mapper02《demo》

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



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


679140-20160323214006214-445549415.png

下面是我安装网上的教程做的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();


679140-20160323214009042-997104702.png


这样就成功了。


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();


679140-20160323214011261-1766288404.png

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.\r\n\r\nMapping types:\r\nBookStoreDto ->  BookStore\r\nAMapper.Class.BookStoreDto ->  AMapper.Class.BookStore\r\n\r\nDestination  path:\r\nBookStore\r\n\r\nSource value:\r\nAMapper.Class.BookStoreDto"}”


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


679140-20160323214013558-1652291917.png

就是错在了这里。








目录
相关文章
|
8月前
|
Java 数据库
SpringBoot整合es7.x启动报错:Rejecting mapping update to [AAA] as the final mapping would have more than 1
SpringBoot整合es7.x启动报错:Rejecting mapping update to [AAA] as the final mapping would have more than 1
186 1
|
9月前
|
Java 数据库连接 数据库
mybatis-plus报错:Can not find table primary key in Class
mybatis-plus报错:Can not find table primary key in Class
1730 1
|
前端开发 JavaScript
Bootstrap Table写一个Demo
Bootstrap Table写一个Demo
63 0
Field userDao in com.sd.sbmb.service.impl.UserServiceImpl required a bean of type ‘com.sd.sbmb.dao.U
Field userDao in com.sd.sbmb.service.impl.UserServiceImpl required a bean of type ‘com.sd.sbmb.dao.U
252 0
|
Java 数据库连接 mybatis
mybatis报错Type interface xxx.Dao is not known to the MapperRegistry
mybatis报错Type interface xxx.Dao is not known to the MapperRegistry
|
Java 数据库连接 mybatis
tk.mapper(通用mapper)出现的问题:Error invoking SqlProvider method (tk.mybatis.mapper.provider.SpecialProvid
tk.mapper(通用mapper)出现的问题:Error invoking SqlProvider method (tk.mybatis.mapper.provider.SpecialProvid
388 0
|
Java 开发工具
gradle Could not create service of type CrossBuildFileHashCache using BuildSessionScopeServices.crea
gradle Could not create service of type CrossBuildFileHashCache using BuildSessionScopeServices.createCrossBuildFileHashCache().
6811 0
|
Java
jar的MANIFEST.MF配置了Class-Path, java -classpath设置无效
jar的MANIFEST.MF配置了Class-Path, java -classpath设置无效
261 0
|
C++
c++ demo 05 类
c++ demo 05 类
87 0
Auto Mapper03
Auto Mapper03
138 0
Auto Mapper03

热门文章

最新文章