Gibt es eine Möglichkeit, AutoMapper anzuweisen, alle Eigenschaften außer denen, die explizit zugeordnet sind, zu ignorieren?
Ich habe externe DTO-Klassen, die sich wahrscheinlich von außen ändern, und ich möchte vermeiden, dass jede Eigenschaft explizit ignoriert wird, da das Hinzufügen neuer Eigenschaften die Funktionalität beeinträchtigt (Ausnahmen verursacht), wenn versucht wird, sie meinen eigenen Objekten zuzuordnen.
.net
automapper
Igor Brejc
quelle
quelle
.ForAllOtherMembers(opts => opts.Ignore())
AssertConfigurationIsValid()
Anruf ausführt.) Aus diesem Grund halte ich "Ignoriere den Rest" für ein Antimuster.Antworten:
Dies ist eine Erweiterungsmethode, die ich geschrieben habe und die alle nicht vorhandenen Eigenschaften des Ziels ignoriert. Ich bin mir nicht sicher, ob es noch nützlich sein wird, da die Frage älter als zwei Jahre ist, aber ich bin auf dasselbe Problem gestoßen, das viele manuelle Ignorieraufrufe hinzufügen musste.
Verwendung:
UPDATE : Anscheinend funktioniert dies nicht richtig, wenn Sie benutzerdefinierte Zuordnungen haben, da diese überschrieben werden. Ich denke, es könnte immer noch funktionieren, wenn Sie zuerst IgnoreAllNonExisting und später die benutzerdefinierten Zuordnungen aufrufen.
schdr hat eine Lösung (als Antwort auf diese Frage), mit
Mapper.GetAllTypeMaps()
der herausgefunden wird, welche Eigenschaften nicht zugeordnet sind, und diese automatisch ignoriert wird. Scheint mir eine robustere Lösung zu sein.quelle
Soweit ich verstanden habe, war die Frage, dass es Felder am Ziel gibt, die kein zugeordnetes Feld in der Quelle haben. Deshalb suchen Sie nach Möglichkeiten, diese nicht zugeordneten Zielfelder zu ignorieren.
Anstatt diese Erweiterungsmethode zu implementieren und zu verwenden, können Sie sie einfach verwenden
Jetzt weiß der Automapper, dass er nur überprüfen muss, ob alle Quellfelder zugeordnet sind, aber nicht umgekehrt.
Sie können auch verwenden:
quelle
MemberList.Destination
würde in ähnlicher Weise das Ops-Problem lösen.Ich habe die Erweiterung von Can Gencer aktualisiert, um keine vorhandenen Karten zu überschreiben.
Verwendung:
quelle
Mapper.GetAllTypeMaps()
ist veraltet)Mapper.GetAllTypeMaps()
mitMapper.Configuration.GetAllTypeMaps()
. Hier ist die Referenz github.com/AutoMapper/AutoMapper/issues/1252Ich konnte dies folgendermaßen tun:
Hinweis: Ich verwende AutoMapper v.2.0.
quelle
In Version 5.0.0-beta-1 von AutoMapper wird die
ForAllOtherMembers
Erweiterungsmethode eingeführt, sodass Sie dies jetzt tun können:Beachten Sie, dass die explizite Zuordnung jeder Eigenschaft von Vorteil ist, da Sie niemals Probleme mit der stillschweigenden Zuordnung erhalten, die auftreten, wenn Sie vergessen, eine Eigenschaft zuzuordnen.
In Ihrem Fall ist es möglicherweise ratsam, alle anderen Mitglieder zu ignorieren und ein hinzuzufügen
TODO
, um zurückzukehren und diese explizit zu machen, nachdem sich die Häufigkeit der Änderungen an dieser Klasse beruhigt hat.quelle
ForAllOtherSourceMembers
?Ab AutoMapper 5.0 ist die
.TypeMap
Eigenschaft onIMappingExpression
weg, was bedeutet, dass die 4.2-Lösung nicht mehr funktioniert. Ich habe eine Lösung erstellt, die die ursprüngliche Funktionalität verwendet, jedoch eine andere Syntax aufweist:Implementierung:
quelle
CreateMap<TSource,TDest>()
Ausdruck in einem verwendenProfile
?Es ist einige Jahre her, seit die Frage gestellt wurde, aber diese Erweiterungsmethode scheint mir mit der aktuellen Version von AutoMapper (3.2.1) sauberer zu sein:
quelle
Für diejenigen, die die nicht statische API in Version 4.2.0 und höher verwenden, kann die folgende Erweiterungsmethode ( hier in der
AutoMapperExtensions
Klasse zu finden) verwendet werden:Das Wichtigste dabei ist, dass nach dem Entfernen der statischen API Code wie
Mapper.FindTypeMapFor
dieser nicht mehr funktioniert, daher die Verwendung desexpression.TypeMap
Felds.quelle
expression.TypeMap
ist nicht mehr verfügbar. Hier ist meine Lösung für 5.0public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
um Typprobleme zu beheben.Für Automapper 5.0, um alle nicht zugeordneten Eigenschaften zu überspringen, müssen Sie nur setzen
.ForAllOtherMembers (x => x.Ignore ());
am Ende Ihres Profils.
Beispielsweise:
In diesem Fall wird nur das ID-Feld für das Ausgabeobjekt aufgelöst, alle anderen werden übersprungen. Funktioniert wie ein Zauber, anscheinend brauchen wir keine kniffligen Erweiterungen mehr!
quelle
Ich habe die Antwort von Robert Schroeder für AutoMapper 4.2 aktualisiert. Bei nicht statischen Mapper-Konfigurationen können wir keine verwenden
Mapper.GetAllTypeMaps()
, aber dasexpression
hat einen Verweis auf das ErforderlicheTypeMap
:quelle
Wie möchten Sie festlegen, dass bestimmte Mitglieder ignoriert werden? Gibt es eine Konvention, eine Basisklasse oder ein Attribut, das Sie anwenden möchten? Wenn Sie erst einmal alle Zuordnungen explizit angegeben haben, bin ich mir nicht sicher, welchen Wert AutoMapper für Sie haben würde.
quelle
Dies scheint eine alte Frage zu sein, aber ich dachte, ich würde meine Antwort für alle anderen veröffentlichen, die so aussehen wie ich.
Ich benutze ConstructUsing, Objektinitialisierer in Verbindung mit ForAllMembers ignorieren zB
quelle
Die einzige Information über das Ignorieren vieler Mitglieder ist dieser Thread - http://groups.google.com/group/automapper-users/browse_thread/thread/9928ce9f2ffa641f . Ich denke, Sie können den in ProvidingCommonBaseClassConfiguration verwendeten Trick verwenden, um allgemeine Eigenschaften für ähnliche Klassen zu ignorieren.
Und es gibt keine Informationen über die Funktion "Den Rest ignorieren". Ich habe mir den Code schon einmal angesehen und es scheint mir sehr und sehr schwierig zu sein, solche Funktionen hinzuzufügen. Sie können auch versuchen, ein Attribut zu verwenden und damit ignorierte Eigenschaften zu markieren und generischen / allgemeinen Code hinzuzufügen, um alle markierten Eigenschaften zu ignorieren.
quelle
Ich weiß, dass dies eine alte Frage ist, aber @jmoerdyk in Ihrer Frage:
Sie können diese Antwort wie folgt im Profil ctor verwenden
quelle
Sie können ForAllMembers verwenden, um dann nur so zu überschreiben
Seien Sie vorsichtig, es werden alle ignoriert, und wenn Sie keine benutzerdefinierten Zuordnungen hinzufügen, werden diese bereits ignoriert und funktionieren nicht
Ich möchte auch sagen, ob Sie einen Unit-Test für AutoMapper haben. Und Sie testen, dass alle Modelle mit allen Eigenschaften, die korrekt zugeordnet sind, keine solche Erweiterungsmethode verwenden sollten
Sie sollten explizit ignorieren
quelle
Die aktuelle Lösung (Version 9) zum Ignorieren der Eigenschaften, die im Zieltyp nicht vorhanden sind, besteht darin, eine gespiegelte Zuordnung zu erstellen und diese umzukehren:
quelle
In Version 3.3.1 können Sie einfach
IgnoreAllPropertiesWithAnInaccessibleSetter()
oderIgnoreAllSourcePropertiesWithAnInaccessibleSetter()
Methoden verwenden.quelle