¿Es posible asignar propiedades a instaladores privados usando AutoMapper?Propiedades de mapeo de AutoMapper con configuradores privados
Respuesta
Si se establece el valor de estas propiedades en el constructor como esto
public class RestrictedName
{
public RestrictedName(string name)
{
Name = name;
}
public string Name { get; private set; }
}
public class OpenName
{
public string Name { get; set; }
}
entonces puede utilizar ConstructUsing como esto
Mapper.CreateMap<OpenName, RestrictedName>()
.ConstructUsing(s => new RestrictedName(s.Name));
que trabaja con este código
var openName = new OpenName {Name = "a"};
var restrictedName = Mapper.Map<OpenName, RestrictedName>(openName);
Assert.AreEqual(openName.Name, restrictedName.Name);
Esto no parece ser necesario con la última versión. Puedo mapear en clases con setters privados. Debe estar usando la reflexión internamente. – Monstieur
@Locutus ¿Tal vez podrías convertir ese comentario en una respuesta? Probablemente debería marcarse como la nueva respuesta a esta pregunta. – julealgon
AutoMapper permite ahora (no estoy seguro, desde cuándo) mapear propiedades con entidades privadas. Está utilizando la reflexión para crear objetos.
clases Ejemplo:
public class Person
{
public string Name { get; set; }
public string Surname { get; set; }
}
public class PersonDto
{
public string Fullname { get; private set; }
}
y mapeo:
AutoMapper.Mapper.CreateMap<Person, PersonDto>()
.ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname));
var p = new Person()
{
Name = "John",
Surname = "Doe"
};
var pDto = AutoMapper.Mapper.Map<PersonDto>(p);
AutoMapper trazará un mapa de la propiedad privada con el colocador sin ningún problema. Si desea forzar la encapsulación, debe usar IgnoreAllPropertiesWithAnInaccessibleSetter. Con esta opción, se ignorarán todas las propiedades privadas (y otras inaccesibles).
AutoMapper.Mapper.CreateMap<Person, PersonDto>()
.ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname))
.IgnoreAllPropertiesWithAnInaccessibleSetter();
El problema surgirá, si va a utilizar Silverlight. De acuerdo con MSDN: https://msdn.microsoft.com/en-us/library/stfy7tfc(v=VS.95).aspx
In Silverlight, you cannot use reflection to access private types and members.
Ver #600 Private/internal destination properties.
Solución:
public class PrivateInternalProfile {
protected override Configure() {
ShouldMapField = fieldInfo => true;
ShouldMapProperty = propertyInfo => true;
CreateMap<User, UserDto>(); //etc
}
}
- 1. Mapeo de diccionarios con AutoMapper
- 2. AutoMapper: mapeo parcial
- 3. Profundidad de mapeo de AutoMapper
- 4. AutoMapper mapeo complejo
- 5. Propiedades nulo de Automapper
- 6. ¿Cómo configurar AutoMapper para polimorfismo con mapeo explícito de miembros?
- 7. AutoMapper y es * propiedades especificadas
- 8. AutoMapper Mapeo IEnumerable a DataReader Edición
- 9. AutoMapper con el prefijo
- 10. Asignación de todas las propiedades de tipo 'X' con AutoMapper
- 11. Permitir el mapeo de tipos dinámicos usando AutoMapper o similar?
- 12. Automapper ejecuta extremadamente lento en el mapeo de 1400 registros
- 13. Configuradores de propiedad de tipo anónimo
- 14. AutoMapper junto con la inyección de dependencias
- 15. Cómo administrar propiedades personalizadas en AutoMapper
- 16. Automapper: cómo asignar a los parámetros del constructor en lugar de los generadores de propiedades
- 17. AutoMapper con lista de elementos secundarios anidados
- 18. Uso de Automapper cuando los nombres de propiedades son diferentes
- 19. Asignación de algunas propiedades en lugar de todas usando Automapper
- 20. Cadena de mapa a enumeración con Automapper
- 21. Obtener una excepción con AutoMapper
- 22. Json.NET Serializar miembros privados y no propiedades de solo lectura
- 23. Correlación anidada de Automapper
- 24. Automapper Convention
- 25. ASP.NET MVC - Asignación con Automapper
- 26. ¿Cuáles son las ventajas de usar Automapper?
- 27. Problema con Automapper y Windsor
- 28. OO Design: ¿utiliza internamente propiedades públicas o campos privados?
- 29. ¿Cómo usar AutoMapper?
- 30. ABPeoplePickerNavigationController: quite el botón "Cancelar" sin utilizar métodos/propiedades privados.
¿Qué versión de AutoMapper está usando? ¿Has intentado hacerlo? – PatrickSteele
@blockhead en realidad es una pregunta muy importante, los objetos inmutables son una práctica arquitectónica mucho mejor que los objetos que se pueden cambiar a voluntad (al exponer a sus instaladores públicamente). Esta es la razón exacta por la que Entity Framework recientemente agregó la capacidad de hidratarse en propiedades privadas, para permitir que el modelo de dominio permanezca inmutable después de la hidratación inicial. Quizás no es leozilla lo que necesita mejorar su arquitectura. ;) – Marchy
¿Disculpe? Se supone que las propiedades privadas son privadas. Son datos que pertenecen al objeto, y solo el objeto lo sabe, y deben saber sobre esos datos. – blockhead