Mein Problem ist Hydratisieren eines Viewmodel von einem Linq2Sql-Objekt, das aus der Datenbank zurückgegeben wurde. Wir haben dies in ein paar Bereichen gemacht und haben ein schönes mehrschichtiges Muster dafür entwickelt, aber das neueste Element verlangt nach einigen Enums, die verwendet wurden und das hat Kopfschmerzen verursacht. Momentan ziehen wir uns aus der Datenbank zurück und verwenden dann den Automapper, um in unsere Viewmodels zu hydratisieren (oder flacher zu werden), aber die Enums im Modell scheinen Probleme mit dem Automapper zu verursachen. Ich habe versucht, benutzerdefinierte Resovler zu erstellen, die für alle meine anderen Mapping-Anforderungen ausreichend waren, aber in diesem Fall funktioniert es nicht.Map String zum Enum mit Automapper
Eine Probe des Code wie folgt aussieht:
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>())
ich folgende Fehlermeldung
[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
werde ich mit AutoMapper für alle unsere Mapping-Aktionen bleiben mag, aber ich gesehen habe viele Leute sagen, dass es diese Art von Mappings nicht macht, also frage ich mich, ob ich es falsch benutze? Außerdem habe ich ein paar Erwähnungen von ValueInjecter gesehen - ist dies eine Alternative zu Automapper, oder wird es nützlich sein, einfach die Löcher in Automapper für die Hydration von Modellen zu stopfen und Automapper für die Verflachung zu verwenden?
Ja, ich könnte einfach eine Zeichenkette in meinem ViewModel verwenden, aber ich bin kein Fan von magischen Zeichenketten, und dieses spezielle Element wird von Helfern verwendet, um einige Logik an einer Reihe von Orten auszuführen.
D'oh nach genauerem Betrachten der Beispiele in der Quelle und meine Modelle I realisierte ein paar Dinge zuerst, aus irgendeinem Grund hatte ich die Enum-Eigenschaft auf dem ViewModel Nullable gemacht, die die Hauptprobleme verursacht ?? !! Die zweite Sache war, dass ich den Leerraum, der von unserer Ansicht zurückgegeben wurde, nicht berücksichtigt hatte. "Direct Debit" hätte DirectDebit sein sollen. Sobald ich diese Probleme entfernt hatte, kam Automapper ohne Custom Resolver, etc .. Woo hoo –
+1 für Erwähnung ValueInjecter;) – Omu