Mi problema es hidratar un modelo de vista de un objeto Linq2Sql que se ha devuelto de la base de datos. Hemos hecho esto en algunas áreas y tenemos un buen patrón en capas preparado para ello, pero el último elemento requiere que se utilicen algunas enumeraciones y esto ha causado dolores de cabeza en general. Actualmente nos retiramos de la base de datos y luego utilizamos Automapper para hidratar (o aplanar) en nuestros Viewmodels pero parece que las enumeraciones en el modelo están causando problemas con Automapper. Intenté crear resovlers personalizados que fueron suficientes para todos mis otros requisitos de mapeo, pero no funciona en esta instancia.Cadena de mapa a enumeración con Automapper
Una muestra del código es el siguiente:
public class CustomerBillingTabView{
public string PaymentMethod {get; set;}
...other details
}
public class BillingViewModel{
public PaymentMethodType PaymentMethod {get; set;}
...other details
}
public enum PaymentMethodType {
Invoice, DirectDebit, CreditCard, Other
}
public class PaymentMethodTypeResolver : ValueResolver<CustomerBillingTabView, PaymentMethodType>
{
protected override PaymentMethodType ResolveCore(CustomerBillingTabView source)
{
if (string.IsNullOrWhiteSpace(source.PaymentMethod))
{
source.PaymentMethod = source.PaymentMethod.Replace(" ", "");
return (PaymentMethodType)Enum.Parse(typeof(PaymentMethodType), source.PaymentMethod, true);
}
return PaymentMethodType.Other;
}
}
CreateMap<CustomerBillingTabView, CustomerBillingViewModel>()
.ForMember(c => c.CollectionMethod, opt => opt.ResolveUsing<PaymentMethodTypeResolver>())
me sale el siguiente error
[ArgumentException: Type provided must be an Enum.
Parameter name: enumType]
System.Enum.TryParseEnum(Type enumType, String value, Boolean ignoreCase, EnumResult& parseResult) +9626766
System.Enum.Parse(Type enumType, String value, Boolean ignoreCase) +80
AutoMapper.Mappers.EnumMapper.Map(ResolutionContext context, IMappingEngineRunner mapper) +231
AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext context) +720
me gustaría seguir con AutoMapper para todas nuestras acciones de mapeo pero he visto Mucha gente dice que no hace este tipo de mapeos, así que estoy empezando a preguntarme si lo estoy usando de forma incorrecta. Además, he visto algunas menciones de ValueInjecter: ¿es esta una alternativa a Automapper, o será útil simplemente tapar los agujeros en Automapper para la hidratación de los modelos y usar Automapper para el aplanamiento?
Sí, podría usar una cadena en mi ViewModel, pero no soy fanático de las cuerdas mágicas, y este elemento en particular lo usan los ayudantes para llevar a cabo cierta lógica en varios lugares.
D'oh después de mirar más de cerca los ejemplos en la fuente y mis modelos I me di cuenta de un par de cosas en primer lugar, por alguna razón, hice que la propiedad enum del null "ViewModel" causara los principales problemas ?? !! La segunda cosa es que no había considerado el espacio en blanco devuelto por nuestra vista "Débito directo" debería haber sido DirectDebit ... Una vez que eliminé estos problemas, Automapper lo hizo sin resolucionadores personalizados, etc. Woo hoo –
+1 por mencionar ValueInjecter;) – Omu