Моя проблема заключается в гидратации Viewmodel из объекта Linq2Sql, который был возвращен из базы данных.Мы сделали это в нескольких областях, и для этого был разработан хороший многоуровневый шаблон, но последний элемент требует использования некоторых перечислений, и это вызвало головные боли повсюду.В настоящее время мы отходим от базы данных, затем используем Automapper для гидратации (или сглаживания) в наши Viewmodels, но наличие перечислений в модели, похоже, вызывает проблемы с Automapper.Я пытался создать собственные ресовлеры, которые удовлетворяли бы всем другим моим требованиям к отображению, но в этом случае это не сработало.
Пример кода выглядит следующим образом:
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>())
Я получаю следующую ошибку
[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
Я бы хотел использовать Automapper для всех наших картографических действий, но я видел, что многие люди говорят, что он не выполняет этот тип отображений, поэтому яя начинаю задаваться вопросом, использую ли я это неправильно?Кроме того, я видел несколько упоминаний ValueInjecter - это альтернатива Automapper, или будет полезно просто закрыть отверстия в Automapper для увлажнения моделей и использовать Automapper для выравнивания?
Да, я мог бы просто использовать строку в моей ViewModel, но я не фанат волшебных строк, и этот конкретный элемент используется помощниками для выполнения некоторой логики в ряде мест.