Я сопоставляю сущность, содержащую объекты различных значений, с плоским 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 это лишает смысла использование явного сопоставления каждого свойства.