Laden...

Automapper vs Mapping zur Laufzeit per Config und Refelection

Erstellt von zipperle vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.340 Views
Thema geschlossen
Z
zipperle Themenstarter:in
47 Beiträge seit 2006
vor 12 Jahren
Automapper vs Mapping zur Laufzeit per Config und Refelection

Hi würde gern Eure Meinung hören damit ich die richtige Entscheidung treffe, bin noch neu in dem Theme und habe mir das bisher etwas ergooglet und hier im Forum ein paar Beiträge dazu gelesen 😃

Folgende Situation:
Ich rufe von einem Webservice Daten ab welche aus einer Datenbank stammen. Der Webservice liefert mir die Datansätze in einem CDATA Element als XML. Das Schema zum XML habe ich. Mit XSD.exe habe ich mir die Klassen (Objektstruktur) erzeugen lassen. Zur laufzeit würde ich diese mit XmlSerializer (de-)serialisieren.

Aus einem Datensatz bzw. aus der Objektstruktur benötige nicht alle Klassen/Properties und würde diese in eine eigene von mir definierte Klassenstruktur überführen wollen.

Wie ich bisher recheriert habe, bieten sich mir folgende Möglichkeiten:

  1. Ein ORM Framework:
    Denke das ist aber overkill für meine Anwendung bzw auch nicht geeignet weil ich ja nicht dirket mit der DB kommuniziere sondern über einen Webservice.
    Ist diese Einschätzung korrekt?

  2. Automapper:
    Scheint eine gute Lösung zu sein. Allerdings etwas zu statisch/unflexibel. Wenn nach Auslieferung der Anwendung ein Fehler im Mapping erkannt wird (der beim Testen nicht aufgefallen ist), dann müsste man die Anwendung neu kompilieren. Bin dann evtl zu diesem Zeitpunkt nicht mehr in der Firma tätig und jemand anderes müsste hier den Code kennen bzw. C# Entwickler sein um dies zu ändern.
    Ein weiterer evtl nicht so gravierender Punkt ist, wenn sich das Schema des Xml ändert. Dann müsste ich ja, je nachdem was sich am Schema geändert hat, auch meine eigene Datenklassenstruktur anpassen und neu kompilieren.
    Sind diese Einschätzungen korrekt?

  3. Per Mapping Config Datei und Reflection:
    Diese Lösung hatte ich von Anfang an im Kopf, war mir aber nicht sicher ob realisierbar. In diesem Artikel
    http://www.techrepublic.com/article/applied-reflection-dynamically-accessing-properties-of-a-class-at-runtime/6099345
    scheint die Lösung beschrieben zu sein, wenn ich es richtig verstanden habe. D.h. es gibt eine Config Datei die das mapping der Typen der Klassen und deren Properties beschreibt, das stelle ich mir dann ungefähr so vor in der Config:
    SourceClassType=KlasseA, SourcePropertyName=PropA->DestinationClassType=KlasseB, DestinationPropertyName=PropX.
    Kann das so funktionieren?
    Wenn nun nach meinem Ausscheiden der Firma ein Fehler in dem Mapping erkannt wird, muss man nur die Config anpassen.
    Automapper kann dies nicht? Oder gibt es ein Framework das dies kann um den Weg nicht selber programmieren zu müssen
    Sind diese Einschätzungen korrekt?

Dann habe ich noch zwei Fragen:
a) Die aus dem Schema erzeugte Datenstruktur hat zum Teil unübersichtliche Klassen und Property Bezeichner. Kann XSD.exe oder ein anderes Tool andere Bezeichnernamen generieren? Und dann müsste natürlich wieder später wenn ich die Daten wieder serialisiere und an den Webservice zurück sende, ein zum Schema konformes XML erzeugt werden. Ist das möglich?

b) Dann gibt es noch einen Spezialfall in meinem Schema und dem Mapping auf meine eigene Datenstruktur: Aus irgendeinem Grund generiert mir XSD.exe bei den Klassen immer eine Property "Text" welche vom Typ string[] ist, so wie es aussieht steht hier immer bei index=0 das was in einem Element zwischen den Spitzen klammern steht z.b. <ElementXYZ>abc</ElementXYZ>. Ok während ich das hier schreibe, erkenne ich gerade, dass dieser Text ja irgendwo gespeichert werden muss und da das Element ein komplexer Typ ist, legt XSD.exe dies wohl automtisch an. Aber warum als string array? Hier gibt es doch dann ein Problem, wenn ich genau diesen Wert aus index=0 Mappen möchte auf eine Property in meiner eigenen Datenstruktur. Geht das überhaupt mit Automapper, dass man aus Listen einen Wert mappen kann?

So das war jetz ne Menge Holz ich weis, aber ich hoffe ihr könnt mir trotzdem weiterhelfen auf die richtige Bahn zu kommen. Und ich finde dies ein interessantes Thema und würde gerne darüber mit euch diskutieren. Danke!

742 Beiträge seit 2005
vor 12 Jahren

Warum nicht einfach WCF bzw. eine Webservice mit guter WSDL und auf dem Server ein O/R Mapper?

Z
zipperle Themenstarter:in
47 Beiträge seit 2006
vor 12 Jahren

habe keinen einfluss auf den server/webservice und die gelieferten daten, ich entwickle nur einen client der ein teil der daten wieder in ein anderes system steckt und anders herum auch teile der daten des anderen systems wieder zurück an den webservice.
außerdem würde ein o/r mapper auf dem server nicht mein problem auf der client seite lösen, die vom webservice gelieferten daten in meine datenstruktur zu mappen? wenn dann bräuchte ich doch auch ein o/r mapper auf client seite. oder habe ich da was noch nicht verstanden?

F
10.010 Beiträge seit 2004
vor 12 Jahren

Ja, du hast da einiges nicht verstanden.

ORMapper Mappen Relationale Daten auf Objekte.
Wo hast du auf deiner Seite Relationale Daten?

Was Du machen willst ist XML auf ein Objekt zu mappen.

  1. strenge Typisierung, die man bei Objekten anstrebt kommt immer mit dem "Nachteil" das man neu kompilieren muss wenn sich die Strukturen ändern, wie könnte sonst streng typisiert werden?

  2. Wenn du veränderliche Daten im XML Format hast, lass sie so und beschäftige dich evtl mit LinQ2Xml.

Z
zipperle Themenstarter:in
47 Beiträge seit 2006
vor 12 Jahren

Habe mich jetzt mal etwas in Linq2Xml eingelesen. Das scheint mir ein Lösung zu sein. D.h. ich benötige nicht XSD.exe und die Generierung von c#-code,stattdessen extrahiere ich Teile des XMLs und stecke sie in von mir definierte Typen/Klassenstruktur. Ist doch dann aber ein ähliches Prinzip wie Automapper!? Meine c# Query Texte realisieren dann das Mapping auf meine eigenen Typen. Nur vermtulich einfacher zu programmieren als mit Automapper und etwas flexibler, womit ich wohl das Problem aus Frage b) lösen könnte.

Was mir noch nicht klar ist bei der Lösung mit Linq2Xml, wie ich es hinbekomme mein Objektmodell zurück an den Webservice zu schicken, gemäß dem vom Webservice erwartetem XSD Schema?

Wo hast du auf deiner Seite Relationale Daten?

Ich denke du hast recht, möchte eigentlich nur gewisse Felder aus einem "einfachen" Datensatz extrahieren. Relationale Daten wären es wohl dann, wenn ich aus mehreren unterschiedlichen Datensätzen aus verschiedenen Tabellen etwas abbilden möchte. Das ist bei mir nicht der Fall.

Was Du machen willst ist XML auf ein Objekt zu mappen.

Nicht nur. Ich muss später ein solches Objekt wieder zurück an den Webservice schicken

  1. strenge Typisierung, die man bei Objekten anstrebt kommt immer mit dem "Nachteil" das man neu kompilieren muss wenn sich die Strukturen ändern, wie könnte sonst streng typisiert werden?

Ja das ist mir klar, aber bei meiner Lösung Nr. 3) könnte man wenigstens ein Fehlerhaftes Mapping korrigieren, z.B. falsches Element A aus XML gemapped auf Property X -> korrigiert: Element B gemapped auf Property X. Ok ist fraglich wie wahrscheinlich dieses Szenario ist und ob dies ein gewichtiges Argument für Lösung 3 wäre.

  1. Wenn du veränderliche Daten im XML Format hast, lass sie so und beschäftige dich evtl mit LinQ2Xml.

Wie gesagt mir ist nicht klar wie ich meine Objektstruktur dann zurück in ein Webservice/Schema konformes XML überführen kann.

Warnung von Abt vor 12 Jahren

Crosspost. 1:1 Kopie siehe CodeKicker: Automapper vs Mapping zur Laufzeit per Config und Refelection

[Hinweis] Wie poste ich richtig? Punkt 2.2

Thema geschlossen