AutoMapper рекурсивный - PullRequest
       7

AutoMapper рекурсивный

2 голосов
/ 07 мая 2010

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

public abstract class Test
    {
        public Test()
        {
            this.Id = Guid.NewGuid();
        }

        public Guid Id { get; private set; }
    }

    public class OuterTest : Test
    {
        public InnerTest Inner { get; set; }
    }

    public class InnerTest : Test
    {
        public int Value { get; set; }
    }

и как это проверить:

OuterTest outerDest = Mapper.Map<OuterTest, OuterTest>(outerSource);
            System.Diagnostics.Debug.WriteLine("InnerSource id: " + innerSource.Id);
            System.Diagnostics.Debug.WriteLine("InnerSource value: " + innerSource.Value);
            System.Diagnostics.Debug.WriteLine("OuterSource id: " + outerSource.Id);
            System.Diagnostics.Debug.WriteLine("OuterDest id: " + outerDest.Id);
            System.Diagnostics.Debug.WriteLine("OuterDest.Inner id: " + outerDest.Inner.Id);
            System.Diagnostics.Debug.WriteLine("OuterDest.Inner value: " + outerDest.Inner.Value);

Это результат окна вывода:

InnerSource id: a60fda37-206a-40a8-a7f8-db480149c906
InnerSource value: 2119686684
OuterSource id: 7486899e-2da8-4873-9160-d6096b555c73
OuterDest id: 7486899e-2da8-4873-9160-d6096b555c73
OuterDest.Inner id: a60fda37-206a-40a8-a7f8-db480149c906
OuterDest.Inner value: 2119686684

Проблема в том, что объект innerSource всегда является тем же экземпляром, что и externalDest.Inner (я проверял это с помощью MakeObjectId отладчика VS), но я хотел бы, чтобы они были двумя разными экземплярами.

Как я могу создать рекурсивную карту с таким поведением? Я попытался создать собственный IValueResolver, как показано ниже, но безуспешно.

 public class AutoMapperNewObjectResolver : IValueResolver
        {
            public ResolutionResult Resolve(ResolutionResult source)
            {
                object resolved;
                if (source.Value != null)
                {
                    object instance = Activator.CreateInstance(source.MemberType);
                    resolved = Mapper.Map(source.Value, instance, source.MemberType, source.MemberType);
                }
                else
                {
                    resolved = null;
                }
                ResolutionResult result = source.New(resolved, source.Context.DestinationType);
                return result;


   }
    }

и настроен так:

Mapper.CreateMap<OuterTest, OuterTest>()
                .ForMember(d => d.Inner, o => o.ResolveUsing<AutoMapperNewObjectResolver>().FromMember(src => src.Inner));

Любая помощь приветствуется, спасибо

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