У меня возникли проблемы с отображением моего родительского класса с использованием automapper. Учитывая следующие классы, я создал профиль сопоставления.Automapper Сопоставление базовых классов с наследованием
Mapping классы:
public class SourceClass
{
public int SourceProperty1 { get; set; }
public int SourceProperty2 { get; set; }
public string SourceProperty3 { get; set; }
public string SourceProperty4 { get; set; }
}
public class TargetBaseClass
{
public int TargetProperty1 { get; set; }
public int TargetProperty2 { get; set; }
}
public class TargetClass1: TargetBaseClass
{
public string TargetProperty3 { get; set; }
}
public class TargetClass2: TargetBaseClass
{
public string TargetProperty4 { get; set; }
}
Карта:
public class MappingProfile: Profile
{
protected override void Configure()
{
CreateMap<SourceClass, TargetBaseClass>()
.Include<SourceClass, TargetClass1>()
.Include<SourceClass, TargetClass2>()
.ForMember(dst => dst.TargetProperty1, opt => opt.MapFrom(src => src.SourceProperty1))
.ForMember(dst => dst.TargetProperty2, opt => opt.MapFrom(src => src.SourceProperty2));
CreateMap<SourceClass, TargetClass1>()
.ForMember(dst => dst.TargetProperty3, opt => opt.MapFrom(src => src.SourceProperty3));
CreateMap<SourceClass, TargetClass2>()
.ForMember(dst => dst.TargetProperty4, opt => opt.MapFrom(src => src.SourceProperty4));
}
}
И наконец моя программа:
static void Main(string[] args)
{
Mapper.Initialize(x => x.AddProfile<MappingProfile>());
var sourceClass = new SourceClass
{
SourceProperty1 = 1,
SourceProperty2 = 2,
SourceProperty3 = "3",
SourceProperty4 = "4"
};
var targetBaseClass = Mapper.Map<TargetBaseClass>(sourceClass);
var targetClass1 = Mapper.Map<TargetClass1>(sourceClass);
var targetClass2 = Mapper.Map<TargetClass2>(sourceClass);
Console.WriteLine("TargetBaseClass: {0} {1}", targetBaseClass.TargetProperty1,
targetBaseClass.TargetProperty2); //1 2
Console.WriteLine("TargetClass1: {0} {1} {2}", targetClass1.TargetProperty1, targetClass1.TargetProperty2,
targetClass1.TargetProperty3);//0 0 3 ???
Console.WriteLine("TargetClass2: {0} {1} {2}", targetClass2.TargetProperty1, targetClass2.TargetProperty2,
targetClass2.TargetProperty4);//1 2 4
}
к веро lem, когда я пытаюсь сопоставить производные классы, свойства родительского класса не будут отображаться в случае TargetClass1
, но он будет для TargetClass2
. Может ли кто-нибудь объяснить мне, что я делаю неправильно, и почему эти две карты действуют по-другому? (Имеет ли порядок, в котором я Include
материя?)
Edit: При ближайшем рассмотрении, порядок делает действительно вопрос. Тем не менее, я до сих пор не знаю, почему будет учитываться только второй Include
.
Редактировать 2: Основываясь на комментарии @GruffBunny, я думаю, что смогу «исправить» это с помощью метода расширения. Тем не менее, я не понимаю, почему они это сделали. Глядя на коде AutoMapper.TypeMap
, я могу ясно видеть это:
public void IncludeDerivedTypes(Type derivedSourceType, Type derivedDestinationType)
{
_includedDerivedTypes[derivedSourceType] = derivedDestinationType;
}
Очевидно, это означает, что вы можете указать только одного адресата за включенный тип источника. Однако я ничего не вижу, что помешает им поддерживать более одного типа адресата.
Посмотрите на этот [вопрос] (http://stackoverflow.com/questions/13994081/automapper-inheritance-mapping-not-working-same-source-multiple-destination), который охватывает ваш сценарий. –
@GruffBunny Спасибо, я нашел нечто похожее в вопросе [this] (http://stackoverflow.com/questions/14705064/mapping-one-source-class-to-multiple-derived-classes-with-automapper). Однако я не совсем уверен, является ли это ошибкой или по дизайну. – Kippie