AutoMapper предварительное отображение - PullRequest
0 голосов
/ 30 марта 2019

Я хочу объединить эти Source объекты в List<Destination>.Обратите внимание, что свойства SourceParent и Destination Id ДОЛЖНЫ быть одинаковыми.

var parent = new SourceParent
{
    Id = 1,
    Childs = new List<SourceChild>
     {
         new SourceChild { ChildId = 12, OtherProperty = "prop1" },
         new SourceChild { ChildId = 13, OtherProperty = "prop2" },
         new SourceChild { ChildId = 14, OtherProperty = "prop3" },
     }
};

Mapper.Initialize(cfb =>
{
    cfb.CreateMap<SourceParent, List<Destination>>()
    .ForMember(dest => dest, opt => opt.MapFrom(src => src.Childs));
    cfb.ValidateInlineMaps = false;
});

List<Destination> destination = Mapper.Map<SourceParent, List<Destination>>(parent);           

Классы:

public class SourceParent
{
    public int Id { get; set; }
    public List<SourceChild> Childs { get; set; }
}

public class SourceChild
{
    public string OtherProperty { get; set; }
    public int ChildId { get; set; }
}

public class Destination
{
    public int SourceParentId { get; set; }
    public string OtherProperty { get; set; }
    public int ChildId { get; set; }
}

Есть ли способ создать правило отображения для этого случая?Это вообще возможно?

1 Ответ

1 голос
/ 31 марта 2019

Я думаю, что ваш лучший вариант здесь - это определить TypeConverter.

Вы можете сделать TypeConverters встроенными, как я сделал ниже, или вы можете определить класс, который реализует интерфейс ITypeConverter<TIn, TOut>.

cfb.CreateMap<SourceParent, List<Destination>>().ConvertUsing((src, dest, context) =>
{
    return src.Childs.Select(x => 
    {
        var destination = context.mapper.Map<Destination>(x);
        destination.SourceParentId = src.Id;
        return destination;
    }
});

Если вы хотите (я обычно держусь подальше от этого, потому что это может стать слишком быстрым), вы можете определить другое пользовательское отображение, используя кортеж или класс-обертку, как этот.

cfb.CreateMap<SourceParent, List<Destination>>().ConvertUsing((src, dest, context) =>
{
    return src.Childs.Select(x => context.mapper.Map<Destination>((src.Id, x)))
});

cfb.CreateMap<(int partentId, SourceChild child), Destination>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.parentId))
.ForMember(dest => dest.ChildId, opt => opt.MapFrom(src => src.child.Id))
.ForMember(dest => dest.OtherProperty , opt => opt.MapFrom(src => src.child.OtherProperty ));

Это может быть полезно для небольших примеров, но если вы делаете это часто, это может привести к действительно беспорядочным конфигурациям картографирования (на мой взгляд), но это действительно упрощает ваш конвертер типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...