2012-06-21 16 views
25

Bugün AutoMapper v1.1'i kullanmak için AutoMapper v1.1'i kullanan tam işlevli bir uygulamayı yükselttim ve önceki sürümle karşılaşmadığım bazı sorunlarla karşılaşıyorum. Ben v2.1 karşılaşılan ilk sorun oldu Ancak burada Yanlış yapılandırıcıyı kullanarak AutoMapper

... geri den Dto Domain nesne

public class TypeOne 
{ 
    public TypeOne() 
    { 
    } 

    public TypeOne(TypeTwo two) 
    { 
     //throw ex if two is null 
    } 

    public TypeOne(TypeTwo two, TypeThree three) 
    { 
     //throw ex if two or three are null 
    } 

    public TypeTwo Two {get; private set;} 

    public TypeThree Three {get; private set;} 
} 

public class TypeOneDto 
{ 
    public TypeOneDto() 
    { 
    } 

    public TypeTwoDto Two {get; set;} 

    public TypeThreeDto Three {get; set;} 
} 

için

Mapper.CreateMap<TypeThreeDto, TypeThree>(); 
Mapper.CreateMap<TypeTwoDto, TypeTwo>(); 
Mapper.CreateMap<TypeOneDto, TypeOne>(); 

var typeOne = Mapper.Map<TypeOne>(typeOneDto); 

benim kod haritalama örneğidir AutoMapper, bu hatalardan birinin boş olduğu ve 1 arg kurucusunu kullanması gerektiğinde, yapıcıyı 2 args ile kullanmaya çalıştı.

Sonra
Mapper.CreateMap<TypeOneDto, TypeOne>().ConstructUsing(x => new TypeOne()); 

kullanmaya çalıştı Ama çözemedi bir 'Muğlak İnvokasyon' uyarılarını tuttu.

Sonra
Mapper.CreateMap<TypeOneDto, TypeOne>().ConvertUsing(x => new TypeOne()); 

denenmiş ve başarıyla parametresiz kurucu kullanılarak TypeOne nesnesi oluşturmak ama o zaman özel ayarlayıcı özellikleri ayarlamak için başarısız oldu.

AutoMapper web sitesinde yardım aradım ve iyi bir görünüme sahip olmak için kaynak kodunu yükledim, ancak küçük belgelerle yetinmedim ve ConstructUsing için pek çok birim testi yapılmadı.

V2.1 ile değiştirmem gereken eksik bir şey var mı? V1.1'den çok değiştiğine şaşırdım.

+0

olası yinelenen (http://stackoverflow.com/questions/2239143/automapper-how-to-map-to-constructor-parameters- yerine-yerine-setter) –

+0

"ConstructUsing" kullanırken yukarıda bahsettiğim aynı hatayı alıyorum. Parametresiz kurucu ile yeni bir nesne oluşturduğumda "Belirsiz Çağırma". –

cevap

48

sadece

İşte
Func<ResolutionContext, TypeOne> 

için explicit cast eklemeniz gerekir kodudur:

  1. sıralar hedef tipi kurucular: AutoMapper ait

    Mapper.CreateMap<TypeOneDto, TypeOne>().ConstructUsing(
          (Func<ResolutionContext, TypeOne>) (r => new TypeOne())); 
    

    Güncel sürüm aşağıda açıklandığı gibi çalışır parametre sayısı

    ile
    destTypeInfo.GetConstructors().OrderByDescending(ci => ci.GetParameters().Length); 
    
  2. Parametrelerin kaynak özelliklerle eşleştiği ilk kurucu alır (boş değer için herhangi bir denetim olmaksızın). Sizin durumunuzda iki parametreli kurucu.

[Automapper - yapıcı parametreleri yerine mülkiyet belirleyiciler eşlemek nasıl] arasında
+0

Bu sadece bana biraz keder kurdu. AutoMapper'ın en son sürümünde mükemmel çalışır (3.2.1.0) :) Teşekkürler! – Stu1986C

+3

Oldukça eski bir yazı olmasına rağmen, bunu bulduğuma sevindim: AutoMapper'ın bir kurucu için bir eşleşme olarak gördüğü şey dizisi, sürüm 4 ile tekrar değişmiş gibi görünüyor.0.4. Sorunlardan kaçınmak için, birden fazla kurucunuz varsa, AutoMapper'ın hangi kurucuyu kullanması gerektiğini her zaman belirtmek daha muhafazakar tarafta olabilir. Ayrıca, ikinci bir öneri olarak, tüm haritaları kuran ve ardından 'Mapper.AssertConfigurationIsValid() 'olarak adlandırılan bir otomatik test gerçekleştirin. Böylelikle sorunları erken boşaltabilirsiniz. Mutlu kodlar! – Manfred