Pertanyaan Bagaimana cara menyampaikan nilai-nilai konteks ke Automapper Map?


Saya menggunakan Automapper. Saya memiliki dua kelas: TypeA dengan satu properti; Ketik B dengan dua properti, salah satunya memiliki setter pribadi dan nilai untuk properti ini dilewatkan melalui konstruktor. TypeB tidak memiliki konstruktor default.

Pertanyaan: apakah mungkin untuk mengkonfigurasi Automapper untuk mengkonversi TypeA ke TypeB.

public class TypeA
{
    public string Property1 { get; set; }
}

public class TypeB
{
    public TypeB(int contextId)
    { ContextId = contextId; }

    public string Property1 { get; set; }

    public int ContextId { get; private set; }
}

public class Context
{
    private int _id;

    public void SomeMethod()
    {
        TypeA instanceOfA = new TypeA() { Property1 = "Some string" };

        // How to configure Automapper so, that it uses constructor of TypeB 
        // and passes "_id" field value into this constructor?

        // Not work, since "contextId" must be passed to constructor of TypeB
        TypeB instanceOfB = Mapper.Map<TypeB>(instanceOfA);

        // Goal is to create folowing object
        instanceOfB = new TypeB(_id) { Property1 = instanceOfA.Property1 };
    }
}

5
2017-10-16 06:05


asal


Jawaban:


Anda dapat menggunakan salah satu dari itu ConstructUsing overload untuk memberi tahu AutoMapper konstruktor apa yang harus digunakan

TypeA instanceOfA = new TypeA() { Property1 = "Some string" };
_id = 3;            

Mapper.CreateMap<TypeA, TypeB>().ConstructUsing((TypeA a) => new TypeB(_id));    
TypeB instanceOfB = Mapper.Map<TypeB>(instanceOfA);

// instanceOfB.Property1 will be "Some string"
// instanceOfB.ContextId will be 3

Sebagai solusi alternatif Anda dapat membuat Anda TypeB dengan tangan AutoMapper dapat mengisi sisa properti ":

TypeA instanceOfA = new TypeA() { Property1 = "Some string" };
 _id = 3;            

Mapper.CreateMap<TypeA, TypeB>();

TypeB instanceOfB = new TypeB(_id);
Mapper.Map<TypeA, TypeB>(instanceOfA, instanceOfB);

// instanceOfB.Property1 will be "Some string"
// instanceOfB.ContextId will be 3

8
2017-10-16 06:51