在我的宠物项目中将响应从 DB 映射到 Dto 模型时遇到一些问题:
这里有一些代码(很抱歉,如果它是多余的,但只是想澄清问题):
public class Order
{
// properties...
public List<OrderItem> OrderItems { get; set; } = new();
}
public class OrderItem
{
public decimal Price { get; set; }
public int Quantity { get; set; }
public ProductItemOrdered ItemOrdered { get; set; }
}
public class ProductItemOrdered
{
public int ProductItemId { get; set; }
public string ProductName { get; set; }
public string ImageUrl { get; set; }
}
public class GetOrderByIdHandler : IRequestHandler<GetOrderByIdRequest, GetOrderByIdResponse>
{
// constructor + properties...
public async Task<GetOrderByIdResponse> Handle(GetOrderByIdRequest request, CancellationToken cancellationToken)
{
var query = new GetOrderQuery()
{
Id = request.OrderId
};
var order = await this.queryExecutor.Execute(query);
if (order is null)
{
return new GetOrderByIdResponse()
{
Error = new ErrorModel(ErrorType.NotFound)
};
}
var mappedOrder = this.mapper.Map<Domain.Models.OrderToReturnDto>(order);
var response = new GetOrderByIdResponse()
{
Data = mappedOrder
};
return response;
}
}
public class GetOrderByIdRequest : IRequest<GetOrderByIdResponse>
{
public int OrderId;
}
public class GetOrderQuery : QueryBase<Order>
{
public int Id { get; init; }
public override async Task<Order> Execute(StorageContext context)
=> await context.Orders
.Include(x => x.OrderItems)
.FirstOrDefaultAsync(x => x.Id == this.Id);
}
public class OrderToReturnDto
{
// properties...
public List<OrderItemDto> OrderItems { get; set; } = new();
}
public class OrderItemDto
{
public int ProductId { get; init; }
public decimal Price { get; init; }
public string ProductName { get; init; }
public string ImageUrl { get; init; }
public int Quantity { get; init; }
}
public class OrdersProfile : Profile
{
CreateMap<Order, OrderToReturnDto>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
// other property mappings
.ForMember(dest => dest.OrderItems, opt => opt.MapFrom(src => src.OrderItems));
}
public class OrderItemsProfile : Profile
{
public OrderItemsProfile()
{
CreateMap<OrderItem, OrderItemDto>()
.ForMember(dest => dest.Price, opt => opt.MapFrom(src => src.Price))
.ForMember(dest => dest.Quantity, opt => opt.MapFrom(src => src.Quantity))
.ForMember(dest => dest.ProductId, opt => opt.MapFrom(src => src.ItemOrdered.ProductItemId))
.ForMember(dest => dest.ProductName, opt => opt.MapFrom(src => src.ItemOrdered.ProductName))
.ForMember(dest => dest.ImageUrl, opt => opt.MapFrom(src => src.ItemOrdered.ImageUrl));
}
}
我听到很多意见认为 Automapper 很糟糕并且很难调试。 但我在这个项目中的任何地方都使用 Automapper,并希望继续下去。
预先感谢您的任何建议!
如果我的问题可能会让有人失望,我还不是开发人员:)
从数据库加载数据时,您可能需要再添加一条
ThenInclude
语句。更新以下代码
public override async Task<Order> Execute(StorageContext context)
=> await context.Orders
.Include(x => x.OrderItems)
.FirstOrDefaultAsync(x => x.Id == this.Id);
到
public override async Task<Order> Execute(StorageContext context)
=> await context.Orders
.Include(x => x.OrderItems)
.ThenInclude(o => o.ItemOrdered)
.FirstOrDefaultAsync(x => x.Id == this.Id);