AutoMapper官方文档(四)【扁平化(分割)映射】

扁平化映射

对象-对象映射的一个常见用法是采用复杂的对象模型并将其扁平化为更简单的模型。 你可以采取一个复杂的模型,如:

public class Order
{
    private readonly IList<OrderLineItem> _orderLineItems = new List<OrderLineItem>();

    public Customer Customer { get; set; }

    public OrderLineItem[] GetOrderLineItems()
    {
        return _orderLineItems.ToArray();
    }

    public void AddOrderLineItem(Product product, int quantity)
    {
        _orderLineItems.Add(new OrderLineItem(product, quantity));
    }

    public decimal GetTotal()
    {
        return _orderLineItems.Sum(li => li.GetTotal());
    }
}

public class Product
{
    public decimal Price { get; set; }
    public string Name { get; set; }
}

public class OrderLineItem
{
    public OrderLineItem(Product product, int quantity)
    {
        Product = product;
        Quantity = quantity;
    }

    public Product Product { get; private set; }
    public int Quantity { get; private set;}

    public decimal GetTotal()
    {
        return Quantity*Product.Price;
    }
}

public class Customer
{
    public string Name { get; set; }
}

我们希望将这个复杂的Order对象变成一个更简单的OrderDto,其中只包含特定场景所需的数据:

public class OrderDto
{
    public string CustomerName { get; set; }
    public decimal Total { get; set; }
}

AutoMapper中配置源/目标类型对时,配置程序会尝试将源类型的属性和方法匹配到目标类型的属性。 如果对于目标类型的任何属性,源类型中不存在以Get为前缀的属性,方法或方法,则AutoMapper会将目标成员名称拆分为单个单词(按PascalCase约定)。

//复杂的模型
var customer = new Customer
    {
        Name = "George Costanza"
    };
var order = new Order
    {
        Customer = customer
    };
var bosco = new Product
    {
        Name = "Bosco",
        Price = 4.99m
    };
order.AddOrderLineItem(bosco, 15);

//配置AutoMapper

Mapper.Initialize(cfg => cfg.CreateMap<Order, OrderDto>());

//执行映射

OrderDto dto = Mapper.Map<Order, OrderDto>(order);

dto.CustomerName.ShouldEqual("George Costanza");
dto.Total.ShouldEqual(74.85m);

我们使用CreateMap方法在AutoMapper中配置了类型映射。 AutoMapper只能映射它所知道的类型对,所以我们已经用CreateMap显式地注册了源/目标类型对。 为了执行映射,我们使用Map方法。

在OrderDto类型上,Total属性与Order上的GetTotal()方法匹配。 CustomerName属性与Order上的Customer.Name属性匹配。 只要我们适当地命名我们的目的地属性,我们不需要配置个别的属性匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值