Определение Automapper по соглашению без явного CreateMap - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь создать соглашения Automapper для сопоставления между DTO со свойствами верхнего регистра со знаками подчеркивания и бизнес-POCO, которые являются символом паскаля.

Я хочу сделать это без явного вызова CreateMap для каждого класса, так какправила отображения везде одинаковы.

DTO имеют префикс "T _".

// DTO 
public class T_ACCOUNT
{
    public int ID { get; set; }
    public int? PROFILE_ID { get; set; }
    public bool DELETED { get; set; }
    public string EMAIL { get; set; }
    public bool IS_EMAIL_CONFIRMED { get; set; }
    public DateTime TIME { get; set; }
}

// business model
public class Account
{
    public int Id { get; set; }
    public int? ProfileId { get; set; }
    public bool Deleted { get; set; }
    public string Email { get; set; }
    public bool IsEmailConfirmed { get; set; }
    public DateTime Time { get; set; }
}

Поэтому я создаю маппер следующим образом.

var config = new MapperConfiguration(cfg =>
{
    cfg.AddProfile(new DtoToBusinessProfile());
});

IMapper mapper = new Mapper(config);

Профиль выглядитвот так.

public class DtoToBusinessProfile : Profile
{
    public DtoToBusinessProfile()
    {
        // this should match mapping between "Account" and "T_ACCOUNT"
        AddConditionalObjectMapper()
            .Where((s, d) =>
            {
                return s.Name == d.Name.Substring(2).Pascalize();
            });

        // Now what?
    }
}

Я создал запрос функции в Automapper github, поскольку Я не смог заставить работать INamingConvention интерфейс .

Мне сказали, что то, что я хочу, также возможно с помощью ForAllMaps, но я понятия не имею, что с этим делать.

1 Ответ

0 голосов
/ 20 мая 2019

Обнаружено ошибка в Automapper, но также и рабочее решение с двумя картографами. Очевидно, LowerUnderscoreNamingConvention хорошо работает и с заглавными буквами.

IMapper dtoToBusinessMapper = new MapperConfiguration(cfg =>
{
    cfg.AddConditionalObjectMapper()
       .Where((s, d) => s.Name == d.Name.Substring(2).Pascalize());
    cfg.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
    cfg.DestinationMemberNamingConvention = new PascalCaseNamingConvention();
}).CreateMapper();

IMapper businessToDtoMapper = new MapperConfiguration(cfg =>
{
    cfg.AddConditionalObjectMapper()
       .Where((s, d) => s.Name == "T_" + d.Name.Underscore().ToUpperInvariant());
    cfg.SourceMemberNamingConvention = new PascalCaseNamingConvention();
    cfg.DestinationMemberNamingConvention = new LowerUnderscoreNamingConvention(); 
}).CreateMapper();

T_ACCOUNT tableRow = new T_ACCOUNT()
{
    DELETED = 0,
    EMAIL = "asdf@asdf.cz",
    ID = 8,
    IS_EMAIL_CONFIRMED = 1,
    PROFILE_ID = 11,
    TIME = DateTime.Now
};

Account businessModel = dtoToBusinessMapper.Map<Account>(tableRow);
T_ACCOUNT backToDto = businessToDtoMapper.Map<T_ACCOUNT>(businessModel);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...