2012-11-13 9 views
12

Ben varlıkların biraz var ve şu ana kadar, ben sadece onların her belirtmek zorunda kalmadan hedef nesne eksik özelliklerini görmezden AutoMapper anlatmak istiyorumOtomatik Eşleme'yi, eşleme yaparken eksik özellikleri global olarak görmezden gelerek söyleyebilir misiniz?

Mapper.CreateMap<Employee, EmployeeDetailsDTO>() 
    .ForSourceMember(mem => mem.NewsPosts, opt => opt.Ignore()); 

gibi şeyler yapıyordum. Şimdiye kadar, çoklu SO'm ve Google aramalarımda bunu yapmanın bir yolunu bulamadım. Herkesin bir çözümü var mı? Bir kez yazılabildiği ve model/dto değişiklikleri veya eklenmiş özellikler ile ölçekleneceği sürece bir çeşit döngü veya herhangi bir şey yapmaya hazırım.

cevap

7

Hatası ne zaman alıyorsunuz? AssertConfigurationIsValid'u aradığınızda mı?

public class Foo1 
{ 
    public string Field1 { get; set; } 
} 
public class Foo2 
{ 
    public string Field1 { get; set; } 
    public string Field2 { get; set; } 
} 

Mapper.CreateMap<Foo1, Foo2>(); 
var foo1 = new Foo1() {Field1 = "field1"}; 
var foo2 = new Foo2(); 
Mapper.Map(foo1, foo2);//maps correctly, no Exception 

diğer için AssertConfigurationIsValid çağırmak isteyebilirsiniz:

evet, o zaman basitçe

bu yöntemi çağırmak yok bu yöntem çağırmak yok, işleri aşağıdaki eşleştirmeyi göz önünde eşlemeleri doğru olduklarından emin olmak yerine, yapmanız gerekenler eşlemelerinizi şu Profillere düzenlemektir:

public class MyMappedClassesProfile: Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<Foo1, Foo2>(); 
     //nb, make sure you call this.CreateMap and NOT Mapper.CreateMap 
     //I made this mistake when migrating 'static' mappings to a Profile.  
    } 
} 

Mapper.AddProfile<MyMappedClassesProfile>(); 

ve size (senin durumundaki vaka bazında durumda) haritalama geçerliliğini kontrol karar verirseniz daha sonra

Mapper.AssertConfigurationIsValid(typeof(MyMappedClassesProfile).FullName); 

önemli sizin durumunuzda ve/veya herhangi davayı sen do not callAssertConfigurationIsValid numaralı telefonu arayın, eşleştirmenin çalıştığından emin olmak için AutoFixture ve Unit Unit gibi bir şey kullanmalısınız. (Bu, AssertConfigurationIsValid'un amacıdır)

+0

AssertConfigurationIsValid öğesini aradığımda, ancak birim sınamada kalmasını istedim. Şu anda Global.asax içinde ama sonunda birim testinde hareket edecek (Bu bir ASP.NET MVC uygulaması). Öyleyse temelde, AssertConfigurationIsValid'i kullanmaktan kaçınmam ve DAL'im için kendi birim testimi yazmam gerektiğini söylüyorsun? – Pluc

+0

Bunu, her bir * durumda, haritalamanın basit olduğu yerlerde yapmasını istemiyorum, o zaman AssertConfigurationIsValid'i kullanmaya devam edin. Sorunlu hale geldiği yerlerde daha iyi bildiğiniz için kullanmayın. Ancak, eşlemelerinizi Profiller ("AutoMapper.Profile" uzantısını genişleten sınıflar) halinde düzenlemelisiniz; çünkü bu sıralama eşleme yapılandırmasının durağan yapısını ve daha sonra her Mapper.Map bildirimi için geçerli olacak olan AssertConfigurationIsValid "çağrısını azaltır. ve yapılmış. – wal

+0

Her varlık eksik özelliklere sahip olacaktır, çünkü EF POCO'ları DTO'lara eşleştiriyorum. DTO'lar hiçbir zaman diğer DTO'ları içermeyecekler, daha ziyade ID'leri (bir-bir/bir çok ilişki) saklayacaklar ya da requried varlıktan sorumlu olan ilgili depoyu arayacaklar (ID'si bir parametre olarak).Bazıları sadece tek bir kayıp mülktür, ancak hepsinin en az bir tane vardır. Profilleri kullanmanın, web sunucusu başladığında eşlemelerin yalnızca bir kez (bir web uygulaması olduğundan) yapılandırıldığı için beni çok fazla getireceğinden emin değilim. Ben de sadece Model => DTO için AutoMapper kullanıyorum. ViewModels için kullanmaya başlamadığım sürece, ihtiyacı görmüyorum. – Pluc

3

wal's answer içinde önerildi Eşleştirmelerde olası hataları gizleyeceğinden, AssertConfigurationIsValid() yöntemini çağırmayın, güvenli değildir.
Tüm gerekli özelliklerin doğru şekilde eşlendiğinden emindiğiniz sınıflar arasında eşlemeyi açıkça yok saymak daha iyidir. Sen AutoMapper: "Ignore the rest"? cevap oluşturulan uzantıları kullanabilirsiniz: o da tüm sınıflar için olası sorunları gizler çünkü

var config = new MapperConfiguration(cfg => 
{ 
    cfg.CreateMap<Src, Dest>(); 
    cfg.IgnoreUnmapped<Src, Dest>(); // Ignores unmapped properties on specific map 
}); 

yöntem cfg.IgnoreUnmapped, önerilen tüm haritalar ve üzerinde bağlanılmayan özelliklerini dikkate almaz.