Use o AutomApper para achatar a subclasse de propriedade
-
27-09-2019 - |
Pergunta
Dadas as aulas:
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; }
}
Quero usar o AutomApper para mapear a fonte -> dest.
Este teste obviamente falha:
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);
Qual seria a melhor abordagem para mapear isso, uma vez que a "pessoa" é na verdade um tipo de dados fortemente usado em todo o modelo de domínio.
Editar: A intenção é persistir os objetos "dest" que terão campos definidos para todas as propriedades dos subtipos de "pessoa". Portanto, poderíamos ter objetos de origem como o seguinte e preferir não ter que criar objetos dest para todas as combinações possíveis de subclasses "pessoas":
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; }
}
Solução
Bem, usando a sugestão de Jimmy, eu decidi na solução a seguir:
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);
}
}
Adoraria ouvir sugestões/melhorias.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow