Il mio problema è idratare un Viewmodel da un oggetto Linq2Sql che è stato restituito dal database. Lo abbiamo fatto in alcune aree e abbiamo elaborato un bel modello a strati, ma l'ultimo elemento richiede l'uso di alcune enumerazioni e questo ha causato mal di testa a tutto tondo. Attualmente ritiriamo dal database, quindi usiamo Automapper per idratare (o appiattire) nei nostri Viewmodels ma avere le enumerazioni nel modello sembra causare problemi con Automapper. Ho provato a creare resovlers personalizzati che sono sufficienti per tutti i miei altri requisiti di mapping ma non funziona in questa istanza.Stringa di mappa per enum con Automapper
Un esempio del codice si presenta come:
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>())
ottengo il seguente errore
[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
mi piacerebbe restare con Automapper per tutte le nostre azioni di mappatura, ma ho visto un sacco di gente dice che non fa questo tipo di mappature quindi sto cominciando a chiedermi se lo sto usando nel modo sbagliato? Inoltre, ho visto alcune menzioni di ValueInjecter - questa è un'alternativa ad Automapper, o sarà utile semplicemente tappare i buchi di Automapper per l'idratazione dei modelli e usare Automapper per l'appiattimento?
Sì, potrei semplicemente usare una stringa nel mio ViewModel, ma non sono un fan delle stringhe magiche, e questo particolare elemento viene utilizzato dagli helper per eseguire alcune logiche in un numero di punti.
D'oh dopo aver guardato più da vicino gli esempi nella fonte ei miei modelli I ho realizzato un paio di cose in primo luogo, per qualche motivo ho reso la proprietà enum sul nullable di ViewModel che ha causato i problemi principali ?? !! La seconda cosa era che non avevo considerato lo spazio bianco restituito dal nostro punto di vista "Direct Debit" avrebbe dovuto essere DirectDebit .. Una volta rimossi questi problemi, Automapper lo ha fatto senza i risolutori personalizzati ecc. Woo hoo –
+1 per menzionare ValueInjecter;) – Omu