Отображение дочерней модели представления с параметром AutoMapper - PullRequest
2 голосов
/ 17 января 2020

Я довольно новичок в использовании AutoMapper и столкнулся с проблемой

У меня есть такая модель.

public class StepUp {
    public string Example {get;set;}
    public string Example2 {get;set;}
    public decimal? auxValue { get;set; }
}

Но у меня есть две ViewModels в качестве пункта назначения

public class NuevoStepUpViewModel()
{
    public bool TieneAuxiliar { get; set; }
    public string Example { get;set; }
    public CargaDatosElectricos CargaDatosElectricos { get; set; }
}

public class CargaDatosElectricos {
    public CargaDatosElectricos(bool tieneAuxiliar)
    {
        TieneAuxiliar = tieneAuxiliar;
    }
    public readonly bool TieneAuxiliar;
    public string Example2 { get; set; }
}

Думаю, что-то вроде этого:

CreateMap<StepUp,NuevoStepUpViewModel()
    .ForMember(x => x.TieneAuxiliar, x => x.MapFrom(c => c.auxValue.HasValue))
    .ForMember(x => x.Example, x => x.MapFrom(c => c.Example))
    .ForMember(x => x.CargaDatosElectricos.Example2, x => x.MapFrom(c => c.Example2))
    .BeforeMap((x,y) => {
        x.CargaDatosElectricos = new CargaDatosElectricos(c.auxValue.HasValue);
    });

Но я получаю

Выражение 'x => x.CargaDatosElectricos.Example2' должно разрешиться до верхнего уровня свойства элемента, а не какого-либо дочернего объекта

Как создать конфигурацию сопоставления для такого сопоставления?

1 Ответ

2 голосов
/ 17 января 2020

В вашем коде есть некоторые ошибки. Вы можете лучше настроить отображение, используя область действия AfterMap вместо BeforeMap для обеспечения сложной конфигурации. (Я не уверен, но я думаю, что) AutoMapper не будет создавать экземпляр свойства, где тип является классом. Таким образом, вы должны сделать это на конструкторе класса назначения (VIewModel) или на AfterMap.

Свойство TieneAuxiliar не позволит вам установить значение, когда оно равно readonly, поэтому вы не сможете настроить карту для этого свойства. Я изменяю его на свойство publi c classi c.

См. Рабочий образец здесь:

https://dotnetfiddle.net/HSyUVv

using System;
using AutoMapper;

public class Program
{
    public static void Main()
    {
        var config = new MapperConfiguration(cfg => 
        {
            cfg.CreateMap<StepUp, NuevoStepUpViewModel>()
                .ForMember(vm => vm.TieneAuxiliar, opt => opt.MapFrom(e => e.auxValue.HasValue))
                .ForMember(vm => vm.Example, opt => opt.MapFrom(e => e.Example))
                .AfterMap((e, vm) => 
                          {
                              vm.CargaDatosElectricos.Example2 = e.Example2;
                          });
        });

        var mapper = config.CreateMapper();

        var stepUp = new StepUp()
        {
            Example = "Example 1",
            Example2 = "Example 2",
            auxValue = 10m
        };

        var viewModel = mapper.Map<StepUp, NuevoStepUpViewModel>(stepUp);

        Console.WriteLine("SteUp was converted to ViewModel");
        Console.WriteLine("TieneAuxiliar: {0}", viewModel.TieneAuxiliar);
        Console.WriteLine("Example: {0}", viewModel.Example);
        Console.WriteLine("CargaDatosElectricos.TieneAuxiliar: {0}", viewModel.CargaDatosElectricos.TieneAuxiliar);
        Console.WriteLine("CargaDatosElectricos.Exemple2: {0}", viewModel.CargaDatosElectricos.Example2);

    }

    public class StepUp 
    {
        public string Example { get; set; }
        public string Example2 { get; set; }
        public decimal? auxValue { get; set; }
    }

    public class NuevoStepUpViewModel
    {
        public bool TieneAuxiliar { get; set; }
        public string Example { get;set; }
        public CargaDatosElectricos CargaDatosElectricos { get; set; }

        public NuevoStepUpViewModel() 
        {
            this.CargaDatosElectricos = new CargaDatosElectricos();
        }
    }

    public class CargaDatosElectricos 
    {
        public CargaDatosElectricos()
        {
        }
        public bool TieneAuxiliar { get; set; }
        public string Example2 { get; set; }
    }
}
...