Это ошибка в регулярном выражении соглашения об именах PascalCase от AutoMapper? - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь использовать AutoMapper, чтобы не пришлось вручную писать много отображений кода. Похоже, что это работает нормально для всего, кроме этого одного класса:

CreateMap<AccountConnection, AccountConnectionDto>();
CreateMap<Account, AccountDto>();
CreateMap<Address, AddressDto>() // <--- this one
  .ForMember(dest => dest.StreetAddress1, opt => opt.MapFrom(src => src.street_address_1))
  .ForMember(dest => dest.StreetAddress2, opt => opt.MapFrom(src => src.street_address_2))
  .ForMember(dest => dest.StreetAddress3, opt => opt.MapFrom(src => src.street_address_3));

Если я не сопоставляю эти 3 члена вручную, тогда, когда я запускаю config.AssertConfigurationIsValid();, он выдает.

Exception Details: AutoMapper.AutoMapperConfigurationException:
Unmapped members were found. Review the types and members below.
Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type
For no matching constructor, add a no-arg ctor, add optional arguments, or map all of the constructor parameters
=================================================
Address -> AddressDto (Destination member list)
Proj.Data.Address -> Proj.API.AddressDto (Destination member list)

Unmapped properties:
StreetAddress1
StreetAddress2
StreetAddress3

Я использую следующие соглашения об именах в своем профиле:

SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
DestinationMemberNamingConvention = new PascalCaseNamingConvention();

Это единственные свойства с номерами в имени свойства, поэтому я покопался в источнике AutoMapper на GitHub и нашел регулярное выражение для PascalCaseNamingConvention, которую я использую в своем проекте. Это:

(\p{Lu}+(?=$|\p{Lu}[\p{Ll}0-9])|\p{Lu}?[\p{Ll}0-9]+) Если я добавлю это в https://regex101.com, а затем проверим его по имени моего свойства ShippingAddress1, я получу два совпадения, Shipping и Address1.

Рух-ро! Имя моего исходного свойства shipping_address_1 (не спрашивайте), так что это не сработает. Это потому, что мое соглашение об именах нарушено или PascalCaseNamingConvention должно соответствовать shipping_address_x ShippingAddressX? (Поднялся, чтобы поднять проблему на github AutoMapper, но они просят новичков сначала публиковать сообщения на SO, чтобы узнать, считают ли люди это законной ошибкой или нет).

1 Ответ

0 голосов
/ 27 марта 2020

Из моего тестирования, описанного ниже, я считаю, что указанные соглашения об именах неверны:

public class Address
{
    public string StreetAddress1 { get; set; }
}

public class AddressDto
{
    public string street_address_1 { get; set; }
}

static void Main(string[] args)
{
    // Prints nothing
    PerformMappingTest(new PascalCaseNamingConvention(), new LowerUnderscoreNamingConvention());
    // Prints "Test"
    PerformMappingTest(new LowerUnderscoreNamingConvention(), new PascalCaseNamingConvention());

    Console.ReadKey();
}

static void PerformMappingTest(INamingConvention source, INamingConvention destination)
{
    var config = new MapperConfiguration(cfg => {
        cfg.SourceMemberNamingConvention = source;
        cfg.DestinationMemberNamingConvention = destination;
        cfg.CreateMap<Address, AddressDto>();
    });
    var mapper = config.CreateMapper();
    var address = new Address { StreetAddress1 = "Test" };
    var addressDto = mapper.Map<Address, AddressDto>(address);
    Console.WriteLine(addressDto.street_address_1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...