代码之家  ›  专栏  ›  技术社区  ›  Neil

使用automapper展平属性的子类

  •  1
  • Neil  · 技术社区  · 14 年前

    给定类:

    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映射源->目标。

    此测试显然失败:

    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”对象,该对象将为“person”子类型的所有属性定义字段。因此,我们可以使用如下的源对象,而不必为每个可能的“person”子类组合创建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; }
    }
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   Neil    14 年前

    好吧,根据吉米的建议,我已经解决了以下问题:

    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);
        }
    }
    

    希望听到建议/改进。