2010-07-26 23 views
5

Tengo un escenario en el que me gustaría ignorar algunas propiedades de las clases definidas en la clase base.Problema al ignorar la propiedad de la clase base en asignaciones de clases secundarias usando Automapper

tengo una cartografía inicial como este

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

Entonces modificó para requisitos particulares de la misma familia de ignorar una de las propiedades se define en la clase base NodeDto

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

Sin embargo, cuando intento trazar, Colocar en PlaceDto o Asset en AssetDto, la propiedad ChildNodes no se ignora. Así que terminé haciendo soething como esto

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

Ya que tengo un montón de clases hijas para NodeDto, el proceso anterior es engorroso, y me gustaría saber si hay un mejor enfoque?

Gracias Nabeel

Respuesta

2

lo siento pero no, no hay ninguna otra manera, así es como AutoMapper funciona

5

Se hace aún más complicado si luego decide que desea ignorar no sólo 1, pero 2, 3 o tal vez incluso más propiedades de la clase base. Es posible que no le ayude demasiado en este caso y estoy seguro de que 9 meses después probablemente ya haya encontrado una solución, pero para el beneficio de cualquier otra persona que se encuentre con esta pregunta, un método de extensión podría reducir parte de la complejidad.

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

que luego se le llama así:

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

Hay una mejor manera. Para nuestro proyecto, creamos el archivo mappings.xml con la siguiente estructura.

<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> 

Clase especial AutoMapperUtilis se utiliza para analizar la forma de datos XML y configurar AutoMapper de acuerdo con reglas dadas.

llamada es:

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

Después de que las asociaciones del todo necesarios se cargan automáticamente y ChildCollections especificados son ignorados.

Con estas descripciones de mapeos, podemos elegir entre configuración plana o completa dependiendo de nuestro caso de uso. Estamos utilizando AutoMapper para mapear entre entidades nHibernate y Dto`s que se utilizan con Ria Services, y estamos muy contentos con esta solución.

+0

Exactamente - plantillas o el uso de T4 (integrado en Visual Studio) –

Cuestiones relacionadas