Как преобразовать объект с включенным объектом в другой объект в AutoMapper?

Я использую AutoMapper в своем проекте, и мне нужно преобразовать объект домена с включенным объектом в модель представления. Включенный объект является текущим состоянием объекта предметной области, который имеет текущие характеристики объекта. Модель представления имеет свойства характеристик на том же уровне, что и другие свойства (без включенного объекта), потому что я думаю, что это лучшее решение. Я попытался использовать этот код в MapperProfile:

CreateMap<DomainEntity, ViewModel>
    .ForMember(...)
    ...
    .ForPath(dest => dest, opt => opt.MapFrom(source => 
Mapper.Map<IncludedEntity, ViewModel>(source.Child)));

Но это решение выдает исключение «Mapper не инициализирован. Вызовите Initialize с соответствующей конфигурацией. Если вы пытаетесь использовать экземпляры mapper через контейнер или иным образом, убедитесь, что у вас нет никаких вызовов статических методов Mapper.Map и если вы используете методы расширения ProjectTo или UseAsDataSource, убедитесь, что вы передаете соответствующий экземпляр IConfigurationProvider."

Я использую экземпляр Autofac и mapper. Как мне это сделать?

ОБНОВЛЕНИЕ

Объект домена:

public class Balloon : BaseIdEntity
{
    public int Id { get; set; }

    public string FactoryNumber { get; set; }

    /// <summary>
    /// it's CurrentState of balloon.
    /// </summary>
    public BalloonSnapshot ActualSnapshot { get; set; }
    public int? ActualSnapshotId { get; set; }
}

Текущее состояние:

public class BalloonSnapshot : BaseIdEntity
{
    public int Id { get; set; }

    /// <summary>
    /// It's parent Domaint entity.
    /// </summary>
    public Balloon Balloon { get; set; }
    public int BalloonId { get; set; }

    public DateTime Date { get; set; }
}

ViewModel:

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

    public string FactoryNumber { get; set; }

    public DateTime? Date { get; set; }
}

ОБНОВЛЕНИЕ 2

Мои сопоставления:

CreateMap<Balloon, BalloonDetailDto>
    .ForPath(dest => dest, opt => opt.MapFrom(source => 
Mapper.Map<BalloonSnapshot, BalloonDetailDto>(source)));

CreateMap<BalloonSnapshot, BalloonDetailDto>()
    .ForMember(s => s.Id, opt => opt.Ignore());

Итак, я хочу привести DomaintEntity к одной строке:

var viewModel = _mapper.Map<Balloon, BalloonDetailDto>(balloon);

person Andrew Zakharov    schedule 12.04.2019    source источник
comment
Неясно, можете ли вы показать упрощенные классы и чего вы пытаетесь достичь   -  person TheGeneral    schedule 12.04.2019
comment
ха, я сказал упрощенно! (с только битами, которые вам нужны, чтобы объяснить проблему)   -  person TheGeneral    schedule 12.04.2019
comment
@MichaelRandall Я добавил свои классы.   -  person Andrew Zakharov    schedule 12.04.2019
comment
@MichaelRandall, о, я такой невнимательный. Это лучше?)   -  person Andrew Zakharov    schedule 12.04.2019


Ответы (1)


Я нашел рабочее решение в комментариях к этому вопросу: Как использовать AutoMapper для сопоставления целевого объекта с дочерним объектом в исходном объекте?

Это нужно использовать:

.ConstructUsing((source, ctx) => ctx.Mapper.Map<IncludedEntity, ViewModel>(source.Child))

вместо этого:

.ForPath(dest => dest, opt => opt.MapFrom(source =>
Mapper.Map<IncludedEntity, ViewModel>(source.Child)));
person Andrew Zakharov    schedule 12.04.2019
comment
Но после этого решения у меня возникла проблема, когда я пытаюсь сделать mapper.Map<IEnumerable<Balloon>, IEnumerable<BalloonDetailDto>>. Теперь мне нужно установить этот мапниг, очевидно. - person Andrew Zakharov; 16.08.2019