2010-02-10 12 views

cevap

113

Kullanım ConstructUsing

bu eşleme sırasında kullanılacak yapıcı belirtmek sağlayacaktır. ancak diğer tüm özellikler, sözleşmelere göre otomatik olarak haritalandırılacaktır.

Ayrıca, bu dönüşümün ConvertUsing'dan farklı olduğunu, dönüştürmenin kullanılmasının geleneklerle eşleştirilmediğini, bunun yerine eşlemenin tam denetimini vereceğini unutmayın.

Mapper.CreateMap<ObjectFrom, ObjectTo>() 
    .ConstructUsing(x => new ObjectTo(arg0, arg1, etc)); 

...

using AutoMapper; 
using NUnit.Framework; 

namespace UnitTests 
{ 
    [TestFixture] 
    public class Tester 
    { 
     [Test] 
     public void Test_ConstructUsing() 
     { 
      Mapper.CreateMap<ObjectFrom, ObjectTo>() 
       .ConstructUsing(x => new ObjectTo(x.Name)); 

      var from = new ObjectFrom { Name = "Jon", Age = 25 }; 

      ObjectTo to = Mapper.Map<ObjectFrom, ObjectTo>(from); 

      Assert.That(to.Name, Is.EqualTo(from.Name)); 
      Assert.That(to.Age, Is.EqualTo(from.Age)); 
     } 
    } 

    public class ObjectFrom 
    { 
     public string Name { get; set; } 
     public int Age { get; set; } 
    } 

    public class ObjectTo 
    { 
     private readonly string _name; 

     public ObjectTo(string name) 
     { 
      _name = name; 
     } 

     public string Name 
     { 
      get { return _name; } 
     } 

     public int Age { get; set; } 
    } 
} 
+0

Sanırım "ConstructUsing", automapper'ın daha yeni bir sürümde olması gerekir. kullanıyorsun. Teşekkürler Jon – jlembke

+6

Bu örnek için çok teşekkürler Jon. "ConstructUsing" harika! DTO'larımın gizli olarak işaretlenmiş ayarlayıcılarla değişmez kalmamı sağlar. – Daniel

+3

Benim için bir iş geliştirir; AutoMapper şu anda tüm parametrelerin isteğe bağlı olduğu yapıcıları sevmiyor, bu yüzden sadece .ConstructUsing kullanın (x => yeni MyClass()); –

7

Sen hedefi ayarlamanıza izin verir Map yöntemi kullanmalısınız. Örneğin: özellikler yapıcı parametreleri eşleşirse

Mapper.CreateMap<ObjectFrom, ObjectTo>() 

var from = new ObjectFrom { Name = "Jon", Age = 25 }; 

var to = Mapper.Map(from, new ObjectTo(param1)); 
0

bu cevabı yazma zamanda, AutoMapper sizin için (basit bir CreateMap<>() çağrısı ile) otomatik olarak yapacaktır. Elbette, eğer işler eşleşmezse, .ConstructUsing(...)'u kullanmanın yolu budur.

public class PersonViewModel 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 
} 

public class Person 
{ 
    public Person (int id, string name) 
    { 
     Id = id; 
     Name = name; 
    } 

    public int Id { get; } 

    public string Name { get; } 
} 

public class PersonProfile : Profile 
{ 
    public PersonProfile() 
    { 
     CreateMap<PersonProfile, Person>(); 
    } 
} 

Not: Bu kurulum için automapper eşleştirmeleri Profiles kullandığınız varsayılmaktadır. Aşağıdaki gibi kullanıldığında

, bu doğru nesneyi üretir:

var model = new PersonModel 
{ 
    Id = 1 
    Name = "John Smith" 
} 

// will correctly call the (id, name) constructor of Person 
_mapper.Map<Person>(model); 

Sen resmi wiki on GitHub

2

iyi pratikte automapper yapımı hakkında daha fazla bilgi bulabilirsiniz https://github.com/AutoMapper/AutoMapper/wiki/Construction

AutoMapper den belgelenmiş yaklaşımlar kullanmaktır
public class SourceDto 
{ 
     public SourceDto(int valueParamSomeOtherName) 
     { 
      Value = valueParamSomeOtherName; 
     } 

     public int Value { get; } 
} 

Mapper.Initialize(cfg => cfg.CreateMap<Source, SourceDto>().ForCtorParam("valueParamSomeOtherName", opt => opt.MapFrom(src => src.Value))); 
İlgili konular