AutoMapper——初见

没见之前,我曾无数次的这样做,尽管觉得麻烦,也实在不知道还有更好的方法!

Customer customer = GetCustomerFromDB();

CustomerViewItem customerViewItem = new CustomerViewItem()
                           {
                               FirstName = customer.FirstName,
                               LastName = customer.LastName,
                               DateOfBirth = customer.DateOfBirth,
                               NumberOfOrders = customer.NumberOfOrders
                           };

ShowCustomerInDataGrid(customerViewItem);

一个回眸,便深深记住AutoMapper的脸庞,这次要深入了解一下

DTO(Data Transfer Object)就是数据传输对象,说白了就是一个对象,只不过里边全是数据而已。

为什么要用DTO?

1、DTO更注重数据,对领域对象进行合理封装,从而不会将领域对象的行为过分暴露给表现层

2、DTO是面向UI的需求而设计的,而领域模型是面向业务而设计的。因此DTO更适合于和表现层的交互,通过DTO我们实现了表现层与领域Model之间的解耦,因此改动领域Model不会影响UI层

3、DTO说白了就是数据而已,不包含任何的业务逻辑,属于瘦身型的对象,使用时可以根据不同的UI需求进行灵活的运用

AutoMapper主观理解

AutoMapper可以很方便的实现DTO和领域Model之间的转换,它是一个强大的Object-Object Mapping工具

AutoMapper可以发挥的作用就是根据A的模型和B的模型中的定义,自动将A模型映射为一个全新的B模型。基于访问性的控制或从模型本身上考虑。对外开放的原则是,尽量降低系统耦合度,否则内部一旦变更外部所有的接口都要跟随发生变更;另外,系统内部的一些数据或方法并不希望外部能看到或调用。系统设计的原则是高内聚低耦合,尽量依赖抽象而不依赖于具体。这里感觉automapper就是使数据库实体对一个外部调用实体的转换更简便(不用一个属性一个属性的赋值)。

那么AutoMapper到底应该如何使用呢?


一、创建映射关系

 AutoMapper.Mapper.CreateMap();
  添加到Application_Start或是项目启动开始

二、使用已创建的map关系

简单的映射

即,两个模型之间字段名称,字段类型都一致,则通过该工具能够实现对象之间的自动映射,而无需田间其他的任何配置。
 
  
CustomerViewItem customerViewItem = 
   Mapper.Map(customer);

如上 customer实例中的值就自动复制到新的模型中,而无需一一提取,一一赋值。
 
  

复杂模型

目的模型中存在原模型中不存在的字段名称,或是字段名称相同而类型不同,都无法实现自动映射,这就需要进行创建匹配的时候多添加一些针对这些特殊字段的配置。

名称不同:但是其值来源于元模型的一个或多个字段的值。

Mapper.CreateMap()
    .ForMember(cv => cv.FullName, m => m.MapFrom(
    s => s.FirstName + " " + s.LastName))

名称相同但是类型不同:只是不同的表现形式,表达的意义还是相同的(不常用)

public class Customer
{
    public bool VIP { get; set; }
}
public class CustomerViewItem
{
    public string VIP { get; set; }
}
public class VIPResolver : ValueResolver
{
    protected override string ResolveCore(bool source)
    {
        return source ? "Y" : "N";
    }
}
Mapper.CreateMap()
.ForMember(cv => cv.VIP, m => m.ResolveUsing().FromMember(x => x.VIP));
 
  
 
  

名称相同,但是是在原模型的依赖的类中(或者就数据库而言,就是一张表关联的字表当中)

这种不需要任何配置操作,也可以发生自动映射,但是必须保证关联子表也加载,没有加载的话需要在代码中使用include 同时加载主表的关联表。

public async Task> GetBOBaseInfo(string name, string type)
        {
            return await Context.BO_BaseInfo.Include("CD_TypeCode")
                  .Where(w => w.Name.Equals(name) && w.BOT.Equals(type)).ToListAsync();
        }

 List dalResult = await BOServiceProvider.GetBOBaseInfo(bo.Value, bo.Type);
            
dalResult.Select(AutoMapper.Mapper.Map).ToList();

另外还有很多情况,也可能有更深入的使用,今天先初步了解到这里。

继续加油,不进则退,用知识武装自己,但绝不是隔绝自己的武器,而是交友的自信之基!

 
  

你可能感兴趣的:(ASP.NET,MVC)