Как привести объект с включенным объектом к другому объекту в AutoMapper? - PullRequest
1 голос
/ 12 апреля 2019

Я использую 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."

Iиспользую Autofac и Mapper.Как я могу это сделать?

ОБНОВЛЕНИЕ

DomainEntity:

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; }
}

CurrentState:

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);

1 Ответ

0 голосов
/ 12 апреля 2019

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

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

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

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

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