В AutoMapper 2.0 я использовал Профили для настройки своего отображения. Я использую SourceMemberNameTransformer
и DestinationMemberNameTransformer
, чтобы соответствовать именам моего источника и назначения.
В 2.1.265 этих свойств больше нет в Профиле. Кто-нибудь знает, почему они были удалены? Но что более важно, как я могу продублировать эту функциональность.
Редактировать
Я смотрел на SourceMemberNamingConvention
и DestinationMemberNamingConvention
, но я не могу найти никакой документации о том, как они работают. У кого-нибудь есть опыт использования кастомного INamingConvention
?
Редактировать 2
Члены-источники генерируются из сторонней базы данных. Обычно они используют все строчные имена столбцов с подчеркиванием между словами. Иногда они пропускают подчеркивание, иногда добавляют случайную заглавную букву.
Участники-получатели стараются максимально соблюдать соглашения об именах .NET. Подчеркивания были удалены, первые символы после подчеркивания были написаны заглавными буквами. Внесены дополнительные изменения в регистр, чтобы облегчить чтение имен членов.
Чтобы решить эту проблему, я установил
SourceMemberNameTransformer = name => name.Replace("_", "").ToUpper()
DestinationMemberNameTransformer = name => name.ToUpper()
Редактировать 3
Больше информации для людей из будущего.
Я проверил источник, чтобы увидеть, как используется INamingConvention
. То, как он устроен, немного вводит в заблуждение. Интерфейс определен как
public interface INamingConvention
{
Regex SplittingExpression { get; }
string SeparatorCharacter { get; }
}
Однако AutoMapper не использует полное определение интерфейса для SourceMemberNamingConvention
и DestinationMemberNamingConvention
Он принимает каждого члена типа назначения и применяет DestinationMemberNamingConvention.SplittingExpression
. Затем он принимает эти совпадающие части и вызывает string.Join
, используя SourceMemberNamingConvention.SeparatorCharacter
. Затем он пытается сопоставить элементы типа источника с элементами типа назначения.
Это очень общий обзор того, что делает, и это не попытка описать полную функциональность. Он просто предназначен для того, чтобы показать, как используется INamingConvention
, и показать, что SourceMemberNamingConvention.SplittingExpression
и DestinationMemberNamingConvention.SeparatorCharacter
никогда не используются.
Если вы не можете преобразовать членов назначения, используя эту стратегию, вы должны вручную сопоставить свойства, как подсказывает nemesv .