AutoMapper: «Игнорировать все остальное»? - PullRequest
187 голосов
/ 05 июня 2009

Есть ли способ сказать AutoMapper игнорировать все свойства, кроме тех, которые отображаются явно?

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

Ответы [ 16 ]

8 голосов
/ 05 июня 2009

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

7 голосов
/ 08 марта 2014

Это кажется старым вопросом, но я решил опубликовать свой ответ для всех, кто похож на меня.

Я использую ConstructUsing, инициализатор объекта в сочетании с ForAllMembers игнорирует, например,

    Mapper.CreateMap<Source, Target>()
        .ConstructUsing(
            f =>
                new Target
                    {
                        PropVal1 = f.PropVal1,
                        PropObj2 = Map<PropObj2Class>(f.PropObj2),
                        PropVal4 = f.PropVal4
                    })
        .ForAllMembers(a => a.Ignore());
1 голос
/ 05 июня 2009

Единственная информация о игнорировании многих членов - это тема - http://groups.google.com/group/automapper-users/browse_thread/thread/9928ce9f2ffa641f. Я думаю, что вы можете использовать трюк, используемый в ProvidingCommonBaseClassConfiguration, чтобы игнорировать общие свойства для похожих классов.
И нет никакой информации о функционале «Игнорировать остальные». Я смотрел на код раньше, и мне кажется, что добавить такую ​​функциональность будет очень и очень сложно. Также вы можете попробовать использовать какой-либо атрибут и пометить им игнорируемые свойства и добавить общий / общий код, чтобы игнорировать все отмеченные свойства.

0 голосов
/ 22 марта 2017

Я знаю, что это старый вопрос, но @jmoerdyk в вашем вопросе:

Как бы вы использовали это в цепочечном выражении CreateMap () в профиле?

вы можете использовать этот ответ как внутри профиля ctor

this.IgnoreUnmapped();
CreateMap<TSource, Tdestination>(MemberList.Destination)
.ForMember(dest => dest.SomeProp, opt => opt.MapFrom(src => src.OtherProp));
0 голосов
/ 29 июля 2016

Вы можете использовать ForAllMembers, чем требуется только перезапись как это

public static IMappingExpression<TSource, TDest> IgnoreAll<TSource, TDest>(this IMappingExpression<TSource, TDest> expression)
        {
            expression.ForAllMembers(opt => opt.Ignore());
            return expression;
        }

Будьте осторожны, он будет игнорировать все, и если вы не добавите пользовательское отображение, они уже игнорируются и не будут работать

также, я хочу сказать, если у вас есть модульный тест для AutoMapper. И вы проверяете, что все модели со всеми свойствами сопоставлены правильно, вы не должны использовать такой метод расширения

Вы должны написать игнорировать явно

0 голосов
/ 21 апреля 2015

В версии 3.3.1 вы можете просто использовать IgnoreAllPropertiesWithAnInaccessibleSetter() или IgnoreAllSourcePropertiesWithAnInaccessibleSetter() методы.

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