Отсутствует член в AutoMapper 2.1.265 - PullRequest
5 голосов
/ 01 марта 2012

В 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 .

1 Ответ

1 голос
/ 01 марта 2012

Похоже, эта функция удалена, см. GitHub .

РЕДАКТИРОВАТЬ Переписать после обновления вопроса:

Может быть, встроенный LowerUnderscoreNamingConvention решит вашу проблему. Я проверил с этим кодом:

Mapper.Initialize(c => 
    c.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention());
Mapper.CreateMap<Source, Dest>();
var test = Mapper.Map<Dest>(
    new Source() { test_Another_Prop = "test", test_this_prop = "test" });

Где Source и Dest:

public class Source
{
    public string test_this_prop { get; set; }
    public string test_Another_Prop { get; set; }
    public string test_wronglynamedprop { get; set; }
}

public class Dest
{
    public string TestThisProp { get; set; }
    public string TestAnotherProp { get; set; } 
    public string TestWronglyNamedProp { get; set; }
}

Если это не охватывает все ваши случаи, вы можете проверить, как это реализовано в источнике и создать собственную конвекцию.

РЕДАКТИРОВАТЬ: После комментария:

Если соглашение не применяется, вы можете вручную отменить специальные случаи:

Mapper.CreateMap<Source, Dest>()
    .ForMember(d => d.TestWronglyNamedProp, c => c
    .MapFrom(s => s.test_wronglynamedprop));

Я не вижу другого варианта в текущей версии. Потому что, насколько видите, ничто не заменит MemberNameTransformer с.

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