2012-01-14 10 views
8

O no, o no funciona ... Tengo una única clase de fuente que quiero asignar a varias vistas que se heredan una de la otra.¿Estoy utilizando la funcionalidad Incluir de Automapper 2.0 correctamente?

Básicamente, la clase base es el Detalle, y la clase secundaria es Editar o Actualizar que usa todos los mismos datos que el Detalle, más otros dos campos para administrar sus propias listas o lo que sea.

Éstos son los mapas que estoy usando:

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>(); 

Entonces si Mapper.Map (boleto) ninguna de las propiedades que utilizan MapFrom no se evalúan, que acaba de terminar con los valores que Habría tenido si no hubiera un conjunto de mapas.

¿Qué sucede aquí?

+0

¿Qué versión de Automapper está utilizando? – nemesv

+0

Estoy usando la versión 2.0 – CodeRedick

Respuesta

7

Como una solución alternativa si no desea llamar Mapper.Map dos veces. Puede mover las asignaciones comunes de Detail en un método de extensión:

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))); 
    } 
} 

Y luego usar ese método de extensión al registrar los Ticket -> Update y Ticket -> Edit mapeadores:

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(); 

A continuación, puede utilizar Map normalmente:

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

Un poco más de trabajo, pero definitivamente parece ser el camino correcto a seguir. ¿Soy el único que piensa que tendría más sentido que Include básicamente actúe como este método de extensión? – CodeRedick

+0

La solución a mi problema similar era un poco diferente a esto, pero utiliza el concepto básico de un método de extensión estático. Desearía que AutoMapper lo respaldara de inmediato y, con suerte, lo haga en el futuro. –

5

¿Utilizo correctamente la funcionalidad Incluir de Automapper 2.0?

No - Cuando se utiliza .Include, AutoMapper espera que las clases de destino están en una jerarquía similar a las clases de fuente (Esto se discute más here). En otras palabras, si estuviera mapeando a diferentes subclases de Ticket a Detail, Update y Edit, Include sería apropiado.

Esto no parece ser útil en su caso. Yo recomendaría usar la sobrecarga de .Map que toma un objeto existente y lo modifica. De esta manera, es suficiente para definir una asignación para el tipo de base:

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. 
Cuestiones relacionadas