Beim Überfahren von Ebenen ist es sehr mühsam, rechts- & gt; linke Zuordnungen als eine Möglichkeit zum Auffüllen der Modelle durchzuführen. Zum Beispiel:
%Vor%So können wir einen ModelCopier erstellen, der Modelle mit Reflektion kopiert:
%Vor%Diese Technik vereinfacht die Aufgabe erheblich. Es gibt jedoch ein paar Dinge, die ziemlich verstörend sind:
Am einen Ende des Spektrums können wir Reflexion verwenden, die sehr einfach ist, aber auf Kosten der Wartbarkeit. Das entgegengesetzte Ende des Spektrums ist sehr mühsam, aber sehr wartungsfreundlich.
Reflexion (einfach und gefährlich) & lt; ----- & gt; Direkte Zuweisung (mühsam und wartbar)
Ich bin neugierig, ob irgendjemand einen Kompromiss gefunden hat, der die Leichtigkeit der Verwendung von Reflektion für das Kopieren mit der Wartbarkeit der direkten Zuweisung bietet.
Eine Lösung, mit der wir uns unterhalten haben, war, ein Plugin zu erstellen, das Erweiterungsmethoden generiert, die die Zuweisung von Eigenschaften für jeden Fall übernehmen. Mit anderen Worten, erstellen Sie ein Werkzeug, das den mühsamen Teil behandelt.
BEARBEITEN:
Bitte haben Sie Verständnis dafür, dass es bei dieser Frage nicht darum geht, welches Mapping-Tool verwendet werden soll. Ich versuche zu verstehen, wie wir die Vorteile von reflektionsbasiertem Mapping genießen können und gleichzeitig die Vorteile der Wartbarkeit genießen, die durch direkte Zuweisung (oder einen Property-Map-Vertrag) bereitgestellt wird.
Vermutlich führt der Compiler nicht den notwendigen Test über den gesamten Code durch ... das ist der Punkt, an dem Unit-Tests zur Verfügung stehen. Wenn Sie einen Test für die Konvertierung zwischen den Klassen in den verschiedenen Layern definiert haben (ja, alle möglichen Konvertierungen, die Sie durchführen müssen, sonst wie können Sie sicher sein, dass Ihr Reflektionsansatz in jeder Situation einmal in der Produktion funktioniert?), Einfach Wenn Sie den Test ausführen, wird der Entwickler benachrichtigt, der den Namen der Eigenschaft geändert hat, sodass die Lösung nicht mehr alle Tests besteht. Sie sollten jeden Test (Komponententest, nicht Integrationstest) jedes Mal ausführen, wenn Sie Ihren Quellcode einchecken möchten ... und das sollte nicht ein paar Monate des Codierens sein:))
Also stimme ich wirklich für die Verwendung des Reflexionsansatzes, würzig mit einem Löffel Unit-Test-Ansatz.
Im Ernst, verwenden Sie AutoMapper . Sie können Konvertierungen von einem Typ in einen anderen Typ einrichten. Alle Änderungen an Eigenschaftsnamen werden die Konfiguration des Auto-Mappers unterbrechen, was die Reflektion nicht tut:
%Vor%Dann, um zu und von zu mappen, tun Sie einfach folgendes:
%Vor%Ich bin neugierig, ob jemand eine gefunden hat Kompromiss, der die Leichtigkeit bietet Verwenden von Reflektion zum Kopieren mit dem Wartbarkeit der direkten Zuordnung.
Es klingt wie Sie versuchen, Ihren Kuchen zu haben und es zu essen.
Dies ist ein Problem, dem sich dynamische Sprachen täglich stellen. Es gibt keine magische Pille. Führen Sie entweder die Zuordnungen von links nach rechts durch und erhalten Sie den Schutz des Compilers, oder wickeln Sie Ihre kritischen Zuweisungen in Komponententests ein.
Mein Bauch sagt mir, das ist ein Design-Problem, kein Code-Problem.
Ihre Anforderungen gehen über die Laufzeit (Implementierung) als solche hinaus, da Sie (und wir alle) Abhängigkeitsgraphen usw. benötigen. Dies bedeutet, dass die dynamische Erkennung mit Reflektion out ist. Sie scheinen eine Kompilierungslösung zu benötigen. Abgesehen von @amacas Vorschlag eines Code-Generierungs-Plug-Ins (das Sie einfach schreiben können), welche anderen Optionen könnte es geben?
Tags und Links asp.net-mvc asp.net-mvc-2 architecture automapper