繁体   English   中英

自动映射器:使集合没有其映射器

[英]Automapper: Leave collections without their mapper

鉴于下一个DTO:

public class OrderDTO{
    public int IdOrder{ get; set; }
    public int TotalPrice { get; set; }
    public IEnumerable<ProductDTO> Products { get; set; }
}

public class ProductDTO{
    public int IdProduct { get; set; }
    public int Description { get; set; }
}

问题是我想将订单映射到OrderDTO ,但是有时候,我不需要获取Products

当我需要全部时,我执行下一个:

AutoMapper.Mapper.CreateMap<Order, OrderDTO>().ForMember(
    dest => dest.Products,
    opt => opt.MapFrom(
        // Custom Map the Product with ProductDTO
        order => order.Products.Where(n => n.Active).Select(
            aProduct => new ProductDTO{
                IdProduct = aProduct.IdProduct,
                Description = aProduct.Description
            }
        )
    )
);

它的工作很棒,但是问题是当我不需要产品时 ,我会做下一个:

AutoMapper.Mapper.CreateMap<Order, OrderDTO>()

但它返回一个错误:

产品到ProductDTO的映射丢失。 使用Mapper.CreateMap创建。

那么,如何避免为不需要的集合创建Mapper? (我不想从我不需要的数据库中检索数据)。

我建议您创建另一个不带产品的DTO,命名为OrderWithoutProductsDTOBasicOrderDTO

public class OrderWithoutProductsDTO
{
    public int IdOrder{ get; set; }
    public int TotalPrice { get; set; }    
}

这将使您可以跳过命中订单实体中的产品(从而延迟加载它们),也不会使使用他们的OrderWithoutProductsDTO人感到OrderWithoutProductsDTO -没有人会奇怪为什么没有空的产品列表。 映射看起来就像:

Mapper.CreateMap<Order, OrderWithoutProductsDTO>();

另一个提示-如果您将定义产品和产品DTO的映射,则无需手动映射它们:

Mapper.CreateMap<Product, ProductDTO>();
Mapper.CreateMap<Order, OrderDTO>()
      .ForMember(dest => dest.Products,
                 opt => opt.MapFrom(o =>
                  Mapper.Map<List<ProductDTO>>(o.Products.Where(n => n.Active)));

您可以忽略属性。

AutoMapper.Mapper.CreateMap<Order, OrderDTO>()
     .ForMember(dest => dest.Products, opt => opt.Ignore()) 

编辑:由于性能原因,我认为您正在尝试这样做,但是请考虑不要这样做。 首先,不要经常创建映射器,因为它占用大量CPU并在高负载下很容易获得100%的CPU。 其次,我非常确定自动映射器具有内部缓存,如果给定的对象具有与不执行映射器相同的信息,它将返回一个缓存的对象。 另外,它已经缓存了映射器,您正在销毁它。

话虽如此,如果那是您真正想要做的,请考虑其他选择。 就像另一位DTO一样,@ Sergey Berezovskiy建议。

暂无
暂无

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

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