Automapper: унаследованное отображение не включает плоские свойства - PullRequest
1 голос
/ 09 июля 2019

Я сопоставляю сущность, содержащую объекты различных значений, с плоским DTO, используя AutoMapper.

Хотя я могу сопоставить сущность с базовым DTO с помощью выравнивания с помощью .IncludeMembers(), когда я пытаюсь добавить отображение для производного DTO с помощью .IncludeBase<Customer, CustomerDtoBase>, он выдает ошибку, потому что не обнаруживает свойства, которые не являются явно сопоставлено.

Вот пример кода, который иллюстрирует проблему. (Раскомментируйте нижние сопоставления, чтобы увидеть ошибку):

// Entity
public class Customer
{
    public int Id { get; protected set; }
    public string Name { get; protected set;}
    public Address Address { get; protected set; }
}

// Value object
public class Address
{
    public string Line1 { get; private set; }
    public string Postcode { get; private set; }
}

// Base Dto
public class CustomerDtoBase
{
    public int Id { get; protected set; }
    public string Name { get; protected set;}
    public string AddressLine1 { get; protected set; }
    public string Postcode { get; protected set;}
}

// Derived DTO
public class CreateCustomerDto : CustomerDtoBase
{
    public string CreatedBy { get; protected set; }
}

// Derived DTO
public class UpdateCustomerDto : CustomerDtoBase
{
    public string UpdatedBy { get; protected set; }
}

public static class AutoMapperConfiguration
{
    public static IMapper Configure()
    {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile<CustomProfile>();
        });

        config.AssertConfigurationIsValid();

        return config.CreateMapper();
    }
}

internal class CustomProfile : Profile
{
    public CustomProfile()
    {       
        CreateMap<Customer, CustomerDtoBase>()
            .IncludeMembers(x => x.Address)
            .ForMember(m => m.Id, o => o.Ignore());

        // This uses default convention to map Postcode
        CreateMap<Address, CustomerDtoBase>(MemberList.None)
            .ForMember(m => m.AddressLine1, o => o.MapFrom(x => x.Line1));

/*  
        // This throws an error that Postcode has not been mapped
        CreateMap<Customer, CreateCustomerDto>()
            .IncludeBase<Customer, CustomerDtoBase>()
            .ForMember(m => m.CreatedBy, o => o.Ignore());

        // This throws an error that Postcode has not been mapped
        CreateMap<Customer, UpdateCustomerDto>()
            .IncludeBase<Customer, CustomerDtoBase>()
            .ForMember(m => m.UpdatedBy, o => o.Ignore());
*/          
    }
}

void Main()
{
    var mapper = AutoMapperConfiguration.Configure();   
}

Что-то неверно или отсутствует в этом отображении? Или в AutoMapper есть ошибка / эта функция не поддерживается?

Я могу обойти это путем явного добавления всех отображений для отображений вложенных объектов, например, .ForMember(m => m.Postcode, o => o.MapFrom(x => x.Postcode)) и т. Д. Но при использовании AutoMapper это лишает смысла использование явного сопоставления каждого свойства.

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