2010-05-17 2 views
1

Учитывая классы:Использование 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; } 
} 
+0

Любопытно, что произойдет, если Source.Person является Учителем, а TeacherId вместо StudentId? Мы решаем это, создавая объект PersonDto, а также тип StudentDto для обработки полиморфизма. В противном случае вы попадаете в Лисковские нарушения. –

+0

@Jimmy - отредактировал вопрос для дальнейшего уточнения. «Человек» - это тип данных, который необходимо сопоставить с уровнем персистентности, который * всегда * имеет соответствующие поля, определенные для всех возможных подтипов. В настоящее время мы занимаемся проблемой подтипа в другом месте, просто надеясь, что с помощью automapper было более элегантное решение. – Neil

ответ

1

Ну, используя предложение Джимми, я остановился на следующем решении :

public class Person 
{ 
    public string Name { get; set; } 
} 

public class Student : Person 
{ 
    public int StudentId { get; set; } 
} 
//all subtypes of person will map to this dto 
public class PersonDto 
{ 
    public string Name { get; set; } 
    public int? StudentId { get; set; } 
} 

public class Source 
{ 
    public Person Person { get; set; } 
} 

public class DestDto 
{ 
    public PersonDto Person { get; set; } 
} 

public class Dest 
{ 
    public string PersonName { get; set; } 
    public int? PersonStudentId { get; set; } 
} 

[TestFixture] 
public class RandomTests 
{ 
    [Test] 
    public void Test1() 
    { 
     Mapper.CreateMap<Person, PersonDto>(); 
     Mapper.CreateMap<Student, PersonDto>(); 

     Mapper.CreateMap<Source, DestDto>(); 
     Mapper.CreateMap<DestDto, Dest>(); 

     var source = new Source() { Person = new Student() { Name = "J", StudentId = 5 } }; 

     var destDto = Mapper.Map<Source, DestDto>(source); 
     var destFinal = Mapper.Map<DestDto, Dest>(destDto); 

     Assert.AreEqual(5, destFinal.PersonStudentId); 
    } 
} 

Хотелось бы услышать предложения/улучшения.

Смежные вопросы