2012-01-14 11 views
8

Ya ben değilim, ya da çalışmıyor ... Birbirinden gelen birden çok görünümle eşlemek istediğim tek bir Kaynak sınıfım var.Automapper 2.0's Include işlevini doğru mu kullanıyorum?

Temel olarak Temel sınıf Ayrıntı'dır ve alt sınıf, Ayrıntı ile aynı verileri kullanan Düzenleme veya Güncelleştirme ve kendi listelerini veya başka herhangi bir şeyi yönetmek için diğer birkaç alanı kullanır. İşte

kullanıyorum haritalardır: Ne Mapper.Map (bilet) MapFrom kullanmak özelliklerden herhangi birini değerlendirdi yapmazsan

Sonra
Mapper.CreateMap<Ticket, Detail>() 
       .Include<Ticket, Update>() 
       .Include<Ticket, Edit>() 
       .ForMember(dest => dest.Priority, opt => opt.MapFrom(src => src.Priority.Code)) 
       .ForMember(dest => dest.TicketID, opt => opt.MapFrom(src => src.ID)) 
       .ForMember(dest => dest.Status, opt => opt.MapFrom(src => src.StatusCode)) 
       .ForMember(dest => dest.Category, opt => opt.MapFrom(src => src.ProblemCategoryCode)) 
       .ForMember(dest => dest.crmBusCode, opt => opt.MapFrom(src => src.Company.crmBusCode)) 
       .ForMember(dest => dest.TeamMembers, opt => opt.MapFrom(src => src.Schedules.Where(s => s.CompleteTime == null))); 

      Mapper.CreateMap<Ticket, Update>() 
       .ForMember(m => m.Schedules, opt => opt.MapFrom(t => t.Schedules.Where(s => s.EmployeeID == Util.CurrentUserID() && s.CompleteTime == null))); 

      Mapper.CreateMap<Ticket, Edit>(); 

, sadece değerler ile bitirmek onlar Set haritalama olmasaydı.

Burada neyin var?

+0

Hangi Otomatik Biçimlendirme sürümünü kullanıyorsunuz? – nemesv

+0

Sürüm 2.0 kullanıyorum – CodeRedick

cevap

7

alternatif bir çözüm olarak, Mapper.Map iki kez aramak istemiyorsanız.

public static class MappingExtensions 
{ 
    public static IMappingExpression<Ticket, TDest> MapDetailProperties<TDest>(
     this IMappingExpression<Ticket, TDest> mapBase) where TDest : Detail 
    { 
     return mapBase 
      .ForMember(dest => dest.Priority, 
       opt => opt.MapFrom(src => src.Priority.Code)) 
      ///.... 
      .ForMember(dest => dest.TeamMembers, 
       opt => opt.MapFrom(src => src 
        .Schedules.Where(s => s.CompleteTime == null))); 
    } 
} 

Ve Ticket -> Update ve Ticket -> Edit Haritacıların kaydederken o uzatma yöntemi kullanın: Sen bir uzantısı yöntem haline Detail ortak eşleştirmeleri taşıyabilirsiniz

Mapper.CreateMap<Ticket, Update>() 
    .MapDetailProperties() 
    .ForMember(m => m.Schedules, opt => opt.MapFrom(t => t.Schedules 
     .Where(s => s.EmployeeID == Util.CurrentUserID() && 
      s.CompleteTime == null))); 

Mapper.CreateMap<Ticket, Edit>() 
    .MapDetailProperties(); 

Sonra normal Harita kullanabilirsiniz:

Ticket ticket = new Ticket();  
var edit = Mapper.Map<Ticket, Edit>(ticket); 
var update = Mapper.Map<Ticket, Update>(ticket); 
+1

Biraz daha fazla iş, ama kesinlikle gitmek için doğru yolu gibi görünüyor! Temel olarak bu uzantı yöntemi gibi davranmak için Dahil Et için daha anlamlı olacağını düşünen tek kişi ben miyim? – CodeRedick

+0

Benzer sorunumun çözümü bundan biraz farklıydı, ancak statik bir uzantı yönteminin çekirdek kavramını kullanıyor. AutoMapper'ın bunu kutunun dışında desteklemesini ve umarım gelecekte yapacaklarını umuyorum. –

5

Automapper 2.0's Include işlevini doğru mu kullanıyorum?

Hayır - .Include kullandığınızda, AutoMapper hedef sınıfları (Bu here ayrıca tartışılmaktadır) kaynak sınıfları gibi benzer hiyerarşideki bekler. Başka bir deyişle, Ticket'un farklı alt sınıflarına Detail, Update ve Edit ile eşleşiyor olsaydınız, Include uygun olurdu.

Durumunuzda bu yararlı görünmüyor. Mevcut bir nesneyi alan ve değiştiren .Map aşırı yüklenmesini kullanmanızı tavsiye ederim. Bu şekilde, yalnızca temel türü için bir eşleme tanımlamak zorunda:

Ticket ticket = new Ticket(); 
Edit edit = new Edit(); 

Mapper.Map<Ticket, Detail>(ticket, edit); 
// Edit has now been automapped using the base mapping. 

Mapper.Map<Ticket, Edit>(ticket, edit); 
// The properties unique to Edit have now been mapped.