2010-07-26 25 views
5

Temel sınıfta tanımlı sınıfların bazı özelliklerini yok saymak istediğim bir senaryo var.Alt sınıf özelliğini kullanarak alt sınıf özelliklerinin göz ardı edilmesiyle ilgili sorun Automapper

Ben

Mapper.CreateMap<Node, NodeDto>() 
       .Include<Place, PlaceDto>() 
       .Include<Asset, AssetDto>(); 

Sonra daha bunu böyle özelleştirilmiş böyle bir başlangıç ​​haritalama temel sınıf tanımlanan özelliklerden birini görmezden zorunda NodeDto

Mapper.CreateMap<Node, NodeDto>() 
       .ForMember(dest => dest.ChildNodes, opt => opt.Ignore()); 

Ancak haritasına çalıştığınızda, AssetDto'ya PlaceDto veya Asset'e yerleştirdiğinizde, ChildNodes özelliği göz ardı edilmez. Bu yüzden, yukarıda işlem zahmetlidir ben NodeDto için çocuk sınıfları çok var yana bu

Mapper.CreateMap<Node, NodeDto>() 
       .ForMember(dest => dest.ChildNodes, opt => opt.Ignore()); 
      Mapper.CreateMap<Place, PlaceDto>() 
       .ForMember(dest => dest.ChildNodes, opt => opt.Ignore()); 
      Mapper.CreateMap<Asset, AssetDto>() 
       .ForMember(dest => dest.ChildNodes, opt => opt.Ignore()); 

gibi soething yapmak sona erdi ve ben daha iyi bir yaklaşım olup olmadığını bilmek istiyorum?

Teşekkür Nabeel

cevap

2

ama, hayır, bu

5

çalıştığını automapper nasıl, başka bir yolu yoktur üzgün O gets daha hantal o zaman sadece 1 görmezden istediğinize karar eğer, ancak taban sınıftan 2, 3 veya belki daha fazla özellik. Bu durumda size pek yardımcı olamayabilir ve 9 aydan beri muhtemelen bir çözüm bulmuş olabileceğinizden eminim, ancak bu sorudan başka birinin yararlanması için bir uzatma yöntemi karmaşıklığın bir kısmını azaltabilir.

public static class MappingExtensions 
    { 
     public static IMappingExpression<Node, NodeDto> MapNodeBase<Node, NodeDto>(
      this IMappingExpression<Node, NodeDto> mappingExpression) 
     { 
      // Add your additional automapper configuration here 
      return mappingExpression.ForMember(
       dest => dest.ChildNodes, 
       opt => opt.Ignore() 
      ); 
     } 
    } 

sonra böylece çağırır hangisi:

Mapper.CreateMap<Node, NodeDto>() 
      .MapNodeBase() 
      .Include<Place, PlaceDto>() 
      .Include<Asset, AssetDto>(); 
2

daha iyi bir yol yoktur. Projemiz için aşağıdaki yapıya sahip mappings.xml dosyası oluşturduk.

<mappings> 
    <mapping name="EntityOne"> 
    <configuration name="Flat"> 
     <ignore name="ChildCollectionOne"/> 
     <ignore name="ChildCollectionTwo"/> 
     <ignore name="ChildCollectionThree"/> 
    </configuration> 
    <configuration name="Full"> 
     <include name="ChildCollectionOne" configuration="Flat" type="One"/> 
     <include name="ChildCollectionTwo" configuration="Flat" type="Two"/> 
     <include name="ChildCollectionThree" configuration="Flat" type="Three"/> 
    </configuration> 
    </mapping> 
</mappings> 

Özel sınıf AutoMapperUtilis veri formu xml ayrıştırma ve verilen kurallara göre Automapper yapılandırmak için kullanılır.

Çağrı geçerli:

AutoMapperUtil.Init(typeof(EntityOne),typeof(EntityOneDto), AutoMapperUtilLoadType.Flat); 

hepsi gerekli eşleştirmeleri otomatik yüklenir ve belirtilen ChildCollections göz ardı edilir sonra.

Bu eşleştirmelerde, Use Case'e göre Düz veya Tam yapılandırma arasında seçim yapabiliriz. Ria Services ile kullanılan nHibernate varlıkları ve Dto`lar arasında haritalama için AutoMapper kullanıyoruz ve bu çözümden çok memnunuz.

+0

Tam olarak - veya T4 şablonları (Visual Studio'da yerleşik olarak) kullanın –

İlgili konular