es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Automapper define una variable personalizada utilizada para determinar los valores de varias propiedades en el destino.

Estoy utilizando AutoMapper para mapear algunos DTOs a Modelos de UI. Sin embargo, uno de mis DTOs contiene un campo con datos serializados (los datos serializados representan otro objeto con propiedades) que se utiliza para determinar los valores de varias propiedades del modelo.

Por ejemplo:

public class SourceDTO
{
  public int Id {get; set;}
  public int Name {get; set;}
  public string SerializedDetails {get; set;} 
}

public class DestinationModel
{
  public int Id {get; set;}
  public int Name {get; set;}
  public string Address {get; set;}
  public string AccountNr {get; set;}
}

En este caso, al mapear la fuente al destino, me gustaría poder deserializar el campo SerializedDetails primero y luego usarlo para mapear Address y AccountNr con propiedades de ese objeto, en lugar de deserializarlo dos veces, para cada propiedad. ¿Se puede hacer esto con AutoMapper?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, esto se puede hacer con AutoMapper. AutoMapper proporciona una función llamada “Value Resolvers” que te permite personalizar cómo se asigna un valor desde la fuente al destino.

    En este caso, podemos crear un value resolver personalizado que deserialice el campo SerializedDetails y asigne las propiedades deseadas al modelo de destino.

    Aquí tienes un ejemplo:

    public class CustomResolver : IValueResolver<sourcedto, destinationmodel,="" object="">
    {
        public object Resolve(SourceDTO source, DestinationModel destination, object destMember, ResolutionContext context)
        {
            // Deserializar el campo SerializedDetails al objeto que contiene las propiedades deseadas
            var details = JsonConvert.DeserializeObject<details>(source.SerializedDetails);
    
            // Asignar las propiedades deseadas del objeto al modelo de destino
            destination.Address = details.Address;
            destination.AccountNr = details.AccountNr;
    
            // Devolver null porque estamos actualizando directamente las propiedades del modelo de destino
            return null;
        }
    }
    

    Luego, en nuestra configuración de mapeo, podemos especificar que se utilice este value resolver personalizado para el campo SerializedDetails:

    .CreateMap<sourcedto, destinationmodel="">()
       .ForMember(dest => dest.Address, opt => opt.MapFrom<customresolver>())
       .ForMember(dest => dest.AccountNr, opt => opt.MapFrom<customresolver>());
    

    Ahora, cuando mapeemos desde el DTO de origen al modelo de destino, AutoMapper usará nuestro value resolver personalizado para deserializar el campo SerializedDetails y asignar las propiedades deseadas al modelo de destino.</sourcedto,></sourcedto,>

Comments are closed.