簡體   English   中英

Automapper 一個源多個目的地和派生類

[英]Automapper one source multiple destinations and derived classes

我正在嘗試將一個實體對象映射到不同的視圖模型。 我有一個基礎視圖模型和另外兩個派生自基礎的視圖模型。 視圖模型是通過工廠方法在運行時基於它們的類型屬性創建的。 派生視圖模型沒有單獨的實體,源實體具有派生視圖模型的所有屬性。 問題是 Automapper 能夠通過工廠方法創建正確的對象,但派生對象中的屬性根本沒有映射。 僅映射基本視圖模型的屬性。

示例實體:

public class VehicleEntity
{
    public int Type { get; set; }
    public int LoadCapacity { get; set; }
    public TrailerEntity Trailer { get; set; }
}

public class TrailerEntity
{
    public int Capacity { get; set; }
}

查看模型:

public class VehicleVM
{
    public int Type { get; set; }
}

public class CarVM: VehicleVM
{
    public TrailerVM Trailer { get; set; }
}

public class TruckVM : VehicleVM
{
    public int LoadCapacity { get; set; }
}

public class TrailerVM
{
    public int Capacity { get; set; }
}

public static class VehicleFactory
{
    public static VehicleVM GetInstance(int type)
    {
        switch (type)
        {
            case 1:
                return new CarVM();
            case 2:
                return new TruckVM();
            default:
                return new VehicleVM();
        }
    }
}

最后是映射:

        List<VehicleEntity> vehicleList = new List<VehicleEntity>();
        vehicleList.Add(new VehicleEntity()
        {
            Type = 1,
            LoadCapacity = 0,
            Trailer = new TrailerEntity()
            {
                Capacity = 120
            }
        });

        vehicleList.Add(new VehicleEntity()
        {
            Type = 2,
            LoadCapacity = 8000,
            Trailer = null
        });

        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<VehicleEntity, VehicleVM>()
                .ConstructUsing((Func<VehicleEntity, VehicleVM>)(rc => VehicleFactory.GetInstance(rc.Type)))
                .Include<VehicleEntity, TruckVM>()
                .Include<VehicleEntity, CarVM>();
            cfg.CreateMap<VehicleEntity, TruckVM>();
            cfg.CreateMap<VehicleEntity, CarVM>();
            cfg.CreateMap<TrailerEntity, TrailerVM>();
        });

        IMapper mapper = config.CreateMapper();
        var vehicleVMs = mapper.Map<List<Data.VehicleEntity>, List<VehicleVM>>(vehicleList);

在上面的例子中,只有 Type 屬性被映射到 CarVM 和 TruckVM 中。 其他屬性不是......我也嘗試過使用 ForMember 方法來映射來自源實體的派生類屬性,但沒有運氣。

cfg.CreateMap<VehicleEntity, TruckVM>().ForMember(dst => dst.LoadCapacity, opt => opt.MapFrom(src => src.LoadCapacity));

有可能實現這一目標嗎?

您可以使用以下配置

var config = new MapperConfiguration(
    cfg =>
    {
        cfg.CreateMap<VehicleEntity, VehicleVM>()
            .ConstructUsing(rc => VehicleFactory.GetInstance(rc.Type))
            .BeforeMap((s, d, c) => c.Mapper.Map(s, d));

        cfg.CreateMap<VehicleEntity, TruckVM>();
        cfg.CreateMap<VehicleEntity, CarVM>();
        cfg.CreateMap<TrailerEntity, TrailerVM>();
    });

在這種情況下, ConstructUsing根據Type屬性創建正確的目標對象,然后在BeforeMap 中將源 VehicleEntity 實例映射到創建的目標對象。 您也可以在AfterMap方法中執行此操作

或者您可以在ConstructUsing 中立即創建目標對象並在其上映射源

var config = new MapperConfiguration(
    cfg =>
    {
        cfg.CreateMap<VehicleEntity, VehicleVM>()
            .ConstructUsing((rc, context) => context.Mapper.Map(rc, VehicleFactory.GetInstance(rc.Type)));

        cfg.CreateMap<VehicleEntity, TruckVM>();
        cfg.CreateMap<VehicleEntity, CarVM>();
        cfg.CreateMap<TrailerEntity, TrailerVM>();
     });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM