Automapper, карта по соглашению об именах - PullRequest
0 голосов
/ 08 мая 2018

Я использую Autopper для отображения своих сущностей. Но сущности имеют разную структуру.

Источник:

public class SourceEntity
{
    public string Name { get; set; }
    public Type Type { get; set; }
    public Communication SelectedCommunication { get; set; }
}

public enum Type
{
    Type1=1,
    Typ2
}

[Flags]
public enum Communication
{
    Phone =1,
    Email =2,
    Post =4
}

Также у меня есть HasFlag() метод расширения, который будет возвращать true, если установлен флаг.

Целевой объект:

public class DestinationEntity
{
    public string Name { get; set; }
    public bool Type1_PhoneSelected { get; set; }
    public bool Type1_EmailSelected { get; set; }
    public bool Type1_PostSelected { get; set; }
    public bool Type2_PhoneSelected { get; set; }
    public bool Type2_EmailSelected { get; set; }
    public bool Type2_PostSelected { get; set; }
}

Моя карта:

        CreateMap<SourceEntity, DestinationEntity>()
            .ForMember(v => v.Name, opt => opt.MapFrom(i => i.Name));

Но я не могу найти лучший способ сопоставления свойств типов. Можно ли отобразить это без ввода что-то вроде:

.ForMemeber(v=>v.Test1_PhoneSelected, opt=>opt.MapFrom(i=>i.SelectedCommunication.HasFlag(Communication.Phone)))
.ForMemeber(v=>v.Test2_PhoneSelected, opt=>opt.MapFrom(i=>i.SelectedCommunication.HasFlag(Communication.Phone)))

Для каждого из этих свойств. Есть ли способ сопоставить по соглашению об именах? Или какими-то другими способами?

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете использовать пользовательские преобразователи значений

Хотя AutoMapper охватывает довольно много целевых отображений сценарии, есть от 1 до 5% значений назначения, которые нуждаются в небольшая помощь в решении. Много раз это пользовательское значение разрешения логика это логика домена, которая может идти прямо в нашей области. Однако если эта логика относится только к операции отображения, она будет загромождена наши типы источников с ненужным поведением. В этих случаях, AutoMapper позволяет настраивать собственные преобразователи значений для участники назначения.

Пример пользовательского преобразователя значений:

public class YourCustomResolver
    : IMemberValueResolver<object, object, Communication, bool>
{
    private Communication _communication;

    public YourCustomResolver(
        Communication communication)
    {
    }

    public bool Resolve(
        object source, 
        object destination,
        Communication sourceMember, 
        bool destMember, 
        ResolutionContext context)
    {
        return _communication == sourceMember;
    }
}

Ваше отображение будет выглядеть так:

CreateMap<SourceEntity, DestinationEntity>()
    .ForMember(dest => dest.Type1_PhoneSelected, opt => opt.ResolveUsing(new YourCustomResolver(Communication.Phone), src => src.SelectedCommunication))
    .ForMember(dest => dest.Type1_EmailSelected, opt => opt.ResolveUsing(new YourCustomResolver(Communication.Email), src => src.SelectedCommunication))
    .ForMember(dest => dest.Type1_PostSelected , opt => opt.ResolveUsing(new YourCustomResolver(Communication.Post) , src => src.SelectedCommunication))
    .ForMember(dest => dest.Type2_PhoneSelected, opt => opt.ResolveUsing(new YourCustomResolver(Communication.Phone), src => src.SelectedCommunication))
    .ForMember(dest => dest.Type2_EmailSelected, opt => opt.ResolveUsing(new YourCustomResolver(Communication.Email), src => src.SelectedCommunication))
    .ForMember(dest => dest.Type2_PostSelected , opt => opt.ResolveUsing(new YourCustomResolver(Communication.Post) , src => src.SelectedCommunication));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...