Kopieren von Modellen zwischen Layern

8

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:

  • Wir haben effektiv die Möglichkeit verloren, Verwendungen von Eigenschaften auf den Quell- und Zielobjekten zu verfolgen. Wenn Sie beispielsweise Verwendungen (in Resharper) der FirstName-Eigenschaft finden, werden die ModelCopier-Fälle nicht angezeigt.
  • Wenn wir den Namen einer Eigenschaft in der Quell- oder Zielklasse ändern, können wir unbeabsichtigt Laufzeitausnahmen verursachen, da wir möglicherweise nicht erkennen, dass wir sowohl die Quell- als auch die Zielklasse aktualisieren müssen.

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.

    
Page Brooks 27.08.2010, 13:22
quelle

5 Antworten

3

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.

    
themarcuz 27.08.2010, 14:30
quelle
10

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%     
GenericTypeTea 27.08.2010 13:25
quelle
1
  

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.

    
Chuck Conway 27.08.2010 17:08
quelle
0

Eine Möglichkeit wäre, ein separates Dienstprogramm zu schreiben, das Reflektion verwendet, um die Namen der Eigenschaften vom Modell abzurufen, und dann den Quellcode schreibt, um die Eigenschaften verfügbar zu machen.

    
amaca 27.08.2010 13:28
quelle
0

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?

    
Ra. 27.08.2010 22:57
quelle