繁体   English   中英

AutoMapper - Map 当目的地有对象列表时

[英]AutoMapper - Map when destination has a list of objects

我正在尝试使用 AutoMapper 到 map 域 model 到 ASP.NET 核心 Web API 中的 Dtos。

域名 class

public partial class Category
{
    public Category()
    {
        Products = new HashSet<Product>();
    }

    public int Id { get; set; }

    public int CategoryDiscount { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

域产品 Class

public partial class Product
{
    public int Id { get; set; }
    public int CategoryId { get; set; }

    public decimal Price { get; set; }

    public virtual Category Category { get; set; } = null!;
}

DTO class

public class GetCategoryProductsDto
{
    public int Id { get; set; }

    public string CategoryName { get; set; } = string.Empty;

    public int CategoryDiscount { get; set; }

    public List<ProductDto> Products {  get; set; }                  

}

映射器配置

CreateMap<Category, GetCategoryProductsDto>();

一切正常,但我想在扣除类别折扣后计算产品价格。

在此处输入图像描述

解决方案 1:使用.AfterMap()

要在映射后执行Price计算,您可以使用.AfterMap()

CreateMap<Product, ProductDto>();
CreateMap<Category, GetCategoryProductsDto>()
        .AfterMap((src,dest) => 
        {
            dest.Products.ForEach(x => x.Price -= src.CategoryDiscount);
        });

演示解决方案 1 @ .NET Fidde


解决方案 2:使用自定义值解析器

正如@Lucian 建议的那样, 自定义值解析器是处理Price计算的另一种选择。

CreateMap<Product, ProductDto>()
                .ForMember(
                    dest => dest.Price, 
                    opt => opt.MapFrom((src, dest, member, context) => src.Price - src.Category.CategoryDiscount));

CreateMap<Category, GetCategoryProductsDto>();

演示解决方案 2 @ .NET Fiddle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM