2011-12-02 24 views
13

AutoMapper kullanarak özel ayarlayıcılarla özellik atamak mümkün mü? BuÖzel ayarlayıcılarla AutoMapper eşleme özellikleri

public class RestrictedName 
{ 
    public RestrictedName(string name) 
    { 
     Name = name; 
    } 

    public string Name { get; private set; } 
} 

public class OpenName 
{ 
    public string Name { get; set; } 
} 

gibi yapıcı bu özellikler için değer ayarlarsanız

+0

kullandığınız Automapper sürümü nedir? Bunu denedin mi? – PatrickSteele

+8

Blockhead aslında çok önemli bir sorudur, değişmez nesneler, istendiğinde değiştirilebilen nesnelerden çok daha iyi bir mimari uygulamadır (setleyicilerini kamuya açık olarak göstererek). Bu, Entity Framework'ün yakın zamanda, ilk hidrasyondan sonra etki alanı modelinin değişmez kalmasına izin vermek için özel özelliklere hidratlama yeteneğini eklediğinin tam sebebidir. Belki de mimarilerini tazelemek için gerekli olan leozilla değildir. ;) – Marchy

+0

Özür diler misiniz? Özel mülklerin özel olması gerekiyor. Nesneye ait olan veridir ve sadece nesne bilir ve bu verileri bilmelidir. – blockhead

cevap

15

o zaman bu kodun

var openName = new OpenName {Name = "a"}; 
var restrictedName = Mapper.Map<OpenName, RestrictedName>(openName); 
Assert.AreEqual(openName.Name, restrictedName.Name); 
+2

Bu, en son sürümde gerekli görünmüyor. Özel belirleyicilerle sınıfları eşleştirebiliyorum. İçten yansıma kullanmalı. – Monstieur

+0

@Locutus Belki bu yorumu bir cevaba çevirebilirsin? Muhtemelen bu sorunun yeni cevabı olarak işaretlenmelidir. – julealgon

9

ile çalışır bu

Mapper.CreateMap<OpenName, RestrictedName>() 
      .ConstructUsing(s => new RestrictedName(s.Name)); 

gibi ConstructUsing kullanabilirsiniz AutoMapper, özel ayarlayıcılarla özellikleri eşlemek için şimdi (ne zamandan beri emin değilim) izin veriyor. Nesneleri yaratmak için yansıma kullanıyor.

Örnek sınıfları:

public class Person 
{ 
    public string Name { get; set; } 
    public string Surname { get; set; } 
} 


public class PersonDto 
{ 
    public string Fullname { get; private set; } 
} 

Ve haritalama:

AutoMapper.Mapper.CreateMap<Person, PersonDto>() 
    .ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname)); 

var p = new Person() 
{ 
    Name = "John", 
    Surname = "Doe" 
}; 

var pDto = AutoMapper.Mapper.Map<PersonDto>(p); 

AutoMapper hiçbir sorunla özel belirleyici ile mülkiyet eşler. Kapsülleme zorlamak istiyorsanız, IgnoreAllPropertiesWithAnInaccessibleSetter kullanmanız gerekir. Bu seçenek ile, tüm özel özellikler (ve diğer erişilemez) göz ardı edilecektir.

AutoMapper.Mapper.CreateMap<Person, PersonDto>() 
    .ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname)) 
    .IgnoreAllPropertiesWithAnInaccessibleSetter(); 

Silverlight'ı kullanırsanız, sorun ortaya çıkacaktır. MSDN göre: https://msdn.microsoft.com/en-us/library/stfy7tfc(v=VS.95).aspx

In Silverlight, you cannot use reflection to access private types and members. 
3

#600 Private/internal destination properties bakınız.

Çözüm:

public class PrivateInternalProfile { 
    protected override Configure() { 
     ShouldMapField = fieldInfo => true; 
     ShouldMapProperty = propertyInfo => true; 
     CreateMap<User, UserDto>(); //etc 
    } 
}