Учитывая классы:Использование Automapper выравниваться подкласс собственности
public class Person
{
public string Name { get; set; }
}
public class Student : Person
{
public int StudentId { get; set; }
}
public class Source
{
public Person Person { get; set; }
}
public class Dest
{
public string PersonName { get; set; }
public int? PersonStudentId { get; set; }
}
Я хочу использовать Automapper на карте Источник -> Dest.
Этот тест явно не удается:
Mapper.CreateMap<Source, Dest>();
var source = new Source() { Person = new Student(){ Name = "J", StudentId = 5 }};
var dest = Mapper.Map<Source, Dest>(source);
Assert.AreEqual(5, dest.PersonStudentId);
Что бы наилучший подход к отображению этого, учитывая, что «лицо» на самом деле широко используется тип данных на протяжении всей нашей модели предметной области.
Редактировать: Цель состоит в том, чтобы сохранить объекты «Dest», которые будут иметь поля, определенные для всех свойств подтипов «Личность». Таким образом, мы могли бы иметь исходные объекты, такие как следующие, и предпочли бы не иметь, чтобы создать объекты Dest для каждой возможной комбинации «лицо» подклассы:
public class Source2
{
public Person Value1 { get; set; }
public Person Value2 { get; set; }
public Person Value3 { get; set; }
public Person Value4 { get; set; }
public Person Value5 { get; set; }
}
Любопытно, что произойдет, если Source.Person является Учителем, а TeacherId вместо StudentId? Мы решаем это, создавая объект PersonDto, а также тип StudentDto для обработки полиморфизма. В противном случае вы попадаете в Лисковские нарушения. –
@Jimmy - отредактировал вопрос для дальнейшего уточнения. «Человек» - это тип данных, который необходимо сопоставить с уровнем персистентности, который * всегда * имеет соответствующие поля, определенные для всех возможных подтипов. В настоящее время мы занимаемся проблемой подтипа в другом месте, просто надеясь, что с помощью automapper было более элегантное решение. – Neil