С помощью AutoMapper как получить значение из сопоставленного родителя для дочернего элемента коллекции без использования AfterMap? - PullRequest
1 голос
/ 21 января 2012

Допустим следующее:

public class ParentSource
{
    public Guid parentId { get; set; }

    public ICollection<ChildSource> children { get; set; }
}

public class ChildSource
{
    public Guid childId { get; set; }
}

public class ParentDestination
{
    public Guid parentId { get; set; }

    public ICollection<ChildDestination> children { get; set; }
}

public class ChildDestination
{
    public Guid childId { get; set; }
    public Guid parentId { get; set; }
    public ParentDestination parent;
}

Как заполнить объект ChildDestination информацией о родителе с помощью AutoMapper без использования .AfterMap?

Ответы [ 2 ]

1 голос
/ 24 января 2012

Я думаю, что единственный способ заполнить дочерний объект в коллекции ссылкой на родительский экземпляр коллекции-члена без использования .AfterMap() - это пользовательский TypeConverter<TSource, TDestination>.

class Program
{
    static void Main(string[] args)
    {
        AutoMapper.Mapper.CreateMap<ParentSource, ParentDestination>().ConvertUsing<CustomTypeConverter>();

        ParentSource ps = new ParentSource() { parentId = Guid.NewGuid() };
        for (int i = 0; i < 3; i++)
        {
            ps.children.Add(new ChildSource() { childId = Guid.NewGuid() });
        }

        var mappedObject = AutoMapper.Mapper.Map<ParentDestination>(ps);

    }
}

public class ParentSource
{
    public ParentSource()
    {
        children = new HashSet<ChildSource>();
    }

    public Guid parentId { get; set; }
    public ICollection<ChildSource> children { get; set; }
}

public class ChildSource
{
    public Guid childId { get; set; }
}

public class ParentDestination
{
    public ParentDestination()
    {
        children = new HashSet<ChildDestination>();
    }
    public Guid parentId { get; set; }
    public ICollection<ChildDestination> children { get; set; }
}

public class ChildDestination
{
    public Guid childId { get; set; }
    public Guid parentId { get; set; }
    public ParentDestination parent { get; set; }
}

public class CustomTypeConverter : AutoMapper.TypeConverter<ParentSource, ParentDestination>
{
    protected override ParentDestination ConvertCore(ParentSource source)
    {
        var result = new ParentDestination() { parentId = source.parentId };
        result.children = source.children.Select(c => new ChildDestination() { childId = c.childId, parentId = source.parentId, parent = result }).ToList();
        return result;
    }
}

Или вы можете использовать .AfterMap(). :)

1 голос
/ 23 января 2012

Как вы сказали в своем комментарии, ForMember будет еще одним вариантом, если вы не хотите использовать AfterMap.Вы можете создать конвертер ForMember, который, используя linq, может довольно быстро перебрать исходные дочерние элементы, преобразовать их в дочерние конечные объекты и затем установить свойство Parent.

Или вы можете использовать AfterMap.:)

ОБНОВЛЕНИЕ:

Может быть что-то вроде этого (не проверено):

.ForMember(d => d.children, 
    o => o.MapFrom(s => 
        from child in s.children
        select new ChildDestination {
            childId = child.childId,
            parentId = s.parentId,
            parent = s
        }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...