Есть ли способ сказать AutoMapper игнорировать все свойства, кроме тех, которые отображаются явно?
У меня есть внешние классы DTO, которые могут измениться извне, и я хочу избежать указания каждого свойства, которое будет явно игнорироваться, так как добавление новых свойств нарушит функциональность (вызывает исключения) при попытке сопоставить их с моими собственными объектами.
.net
automapper
Игорь Брейц
источник
источник
.ForAllOtherMembers(opts => opts.Ignore())
AssertConfigurationIsValid()
вызов) Из-за этого я считаю «Игнорировать остальное» антипаттерном.Ответы:
Это метод расширения, который я написал, который игнорирует все несуществующие свойства в месте назначения. Не уверен, будет ли он по-прежнему полезен, так как этому вопросу более двух лет, но я столкнулся с той же проблемой, когда пришлось добавить множество игнорируемых вручную вызовов.
Использование:
ОБНОВИТЬ : Очевидно, это не работает правильно, если у вас есть пользовательские сопоставления, потому что он перезаписывает их. Я предполагаю, что он все еще может работать, если сначала вызвать IgnoreAllNonExisting, а затем пользовательские сопоставления.
У schdr есть решение (в качестве ответа на этот вопрос), которое
Mapper.GetAllTypeMaps()
позволяет выяснить, какие свойства не сопоставлены, и автоматически их игнорировать. Похоже, более надежное решение для меня.источник
Из того, что я понял, вопрос заключался в том, что в месте назначения есть поля, у которых нет сопоставленного поля в источнике, поэтому вы ищете способы игнорировать эти не сопоставленные поля назначения.
Вместо реализации и использования этих методов расширения вы можете просто использовать
Теперь автопроизводитель знает, что ему нужно только проверить, что все исходные поля сопоставлены, но не наоборот.
Вы также можете использовать:
источник
MemberList.Destination
решило бы проблему ops.Я обновил расширение Can Gencer, чтобы не переписывать существующие карты.
Использование:
источник
Mapper.GetAllTypeMaps()
рекомендуется)Mapper.GetAllTypeMaps()
наMapper.Configuration.GetAllTypeMaps()
. Вот ссылка github.com/AutoMapper/AutoMapper/issues/1252Я смог сделать это следующим образом:
Примечание: я использую AutoMapper v.2.0.
источник
Версия 5.0.0-бета-1 AutoMapper представляет
ForAllOtherMembers
метод расширения, поэтому теперь вы можете сделать это:Имейте в виду, что есть явное преимущество в явном сопоставлении каждого свойства, поскольку у вас никогда не возникнет проблем с молчаливым сбоем сопоставления, возникающих, когда вы забываете сопоставить свойство.
Возможно, в вашем случае было бы разумно игнорировать всех других членов и добавить a,
TODO
чтобы вернуться и сделать их явными после того, как частота изменений в этом классе установится.источник
ForAllOtherSourceMembers
?Начиная с AutoMapper 5.0,
.TypeMap
свойство onIMappingExpression
пропало, что означает, что решение 4.2 больше не работает. Я создал решение, которое использует оригинальную функциональность, но с другим синтаксисом:Реализация:
источник
CreateMap<TSource,TDest>()
выражении вProfile
?Прошло несколько лет с тех пор, как вопрос был задан, но этот метод расширения кажется мне чище, используя текущую версию AutoMapper (3.2.1):
источник
Для тех, кто использует нестатический API в версии 4.2.0 и выше, может использоваться следующий метод расширения (найденный здесь в
AutoMapperExtensions
классе):Здесь важно то, что после удаления статического API такой код, как
Mapper.FindTypeMapFor
, больше не будет работать, следовательно, использованиеexpression.TypeMap
поля.источник
expression.TypeMap
больше не доступен. Вот мое решение для 5.0public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
чтобы исправить проблемы с типом.Для Automapper 5.0, чтобы пропустить все несопоставленные свойства, вам просто нужно положить
.ForAllOtherMembers (х => x.Ignore ());
в конце вашего профиля.
Например:
В этом случае будет разрешено только поле Id для выходного объекта, все остальные будут пропущены. Работает как шарм, кажется, нам больше не нужны хитрые расширения!
источник
Я обновил ответ Роберта Шредера для AutoMapper 4.2. С нестатическими конфигурациями сопоставления мы не можем использовать
Mapper.GetAllTypeMaps()
, ноexpression
есть ссылка на обязательныеTypeMap
:источник
Как бы вы предпочли указать, что некоторые члены игнорируются? Есть ли соглашение, базовый класс или атрибут, который вы хотели бы применить? Когда вы начнете явно указывать все сопоставления, я не уверен, какую ценность вы получите от AutoMapper.
источник
Это кажется старым вопросом, но я решил опубликовать свой ответ для всех, кто похож на меня.
Я использую ConstructUsing, инициализатор объекта в сочетании с ForAllMembers игнорировать, например
источник
Единственная информация об игнорировании многих участников - эта тема - http://groups.google.com/group/automapper-users/browse_thread/thread/9928ce9f2ffa641f . Я думаю, что вы можете использовать трюк, используемый в ProvidingCommonBaseClassConfiguration, чтобы игнорировать общие свойства для похожих классов.
И нет никакой информации о функционале «Игнорировать остальные». Я смотрел на код раньше, и мне кажется, что добавить такую функциональность будет очень и очень сложно. Также вы можете попытаться использовать какой-либо атрибут и пометить им игнорируемые свойства и добавить общий / общий код, чтобы игнорировать все отмеченные свойства.
источник
Я знаю, что это старый вопрос, но @jmoerdyk в вашем вопросе:
Вы можете использовать этот ответ, как это внутри профиля Ctor
источник
Вы можете использовать ForAllMembers, чем нужно перезаписывать только так
Будьте осторожны, он будет игнорировать все, и если вы не добавите пользовательские сопоставления, они уже игнорируются и не будут работать
Кроме того, я хочу сказать, если у вас есть модульный тест для AutoMapper. И вы проверяете, что все модели со всеми свойствами отображаются правильно, вы не должны использовать такой метод расширения
вы должны написать игнорировать явно
источник
Текущее (версия 9) решение для игнорирования свойств, которые не существуют в типе назначения, состоит в том, чтобы создать перевернутое отображение и обратить его вспять:
источник
В версии 3.3.1 вы просто можете использовать
IgnoreAllPropertiesWithAnInaccessibleSetter()
илиIgnoreAllSourcePropertiesWithAnInaccessibleSetter()
методы.источник