1

クラスを考えると:

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 を使用して Source -> 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」オブジェクトを永続化することです。したがって、次のようなソース オブジェクトを持つことができ、"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; }
}
4

1 に答える 1

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

提案/改善を聞きたいです。

于 2010-05-18T02:08:14.593 に答える