3 Stimmen

LINQ to XML, ORM oder etwas ganz anderes"?

Ich arbeite an einem Silverlight-Projekt mit allen Funktionen und Einschränkungen, die das mit sich bringt. Dies ist ein Update zu einem früheren Produkt. Um es schnell auf den Markt zu bringen, soll so viel wie möglich vom Back-End (Webservices, Datenbank usw.) erhalten bleiben. Unser Auftrag ist es, das Back-End nur dann anzurühren, wenn es keine andere Möglichkeit gibt. Wir werden uns in erster Linie darauf konzentrieren, das Frontend neu zu schreiben. Demnächst findet eine wichtige Branchenkonferenz statt, auf der wir das Produkt in seiner frühen Form vorstellen wollen. Vor der offiziellen Freigabe ist vielleicht noch Zeit, um einige Überarbeitungen vorzunehmen, aber das Back-End muss möglicherweise bis V2 warten.

OK, also was ich versuche zu tun ist, verwenden Sie das MVVM-Muster mit Datenbindung für das Front-End, für die ich verantwortlich bin (MVVM-Muster ist von oben diktiert). Ich habe eine pre-existig Web-Service, der bis einige XML dient. Ein Beispiel für dieses XML sieht wie folgt aus:

<CODEBOOKINDEX>
    <ME Words="1" Score="25" Highscore="1">Main Entry Item
        <NM>attack</NM>
        <NM>cardiac</NM>
        <NM>chest</NM>
        <NM>effort</NM>
        <NM>heart</NM>
        <NM>pectoris</NM>
        <NM>syndrome</NM>
        <NM>vasomotor</NM>
        <IE>413.9</IE>

        <M1 Words="1" Score="25">An M1 Item (Same as ME, just first level Child)
            <IE>557.1</IE>
        </M1>

        <M1 Words="1" Score="25">Another M1 Item
        <IE>443.9</IE>
            <M2 Words="1" Score="25">An M2 Item (again same as ME, just a child of an M1 item)
                <CF>Arteriosclerosis,extremities</CF>
                <IE>440.20</IE>
            </M2>
        </M1>
    </ME></CODEBOOKINDEX>

Also, meine Frage, da ich dies zu einem UI mit dem MVVM-Muster binden möchten, scheint es mir, dass ich dies in ein benutzerdefiniertes Objekt übersetzen müssen. Wie Sie sehen können, gibt es eine Reihe von "Entry"-Elementen, MainEntry (ME) und Subentries (M1 oder M2 in diesem Beispiel), diese werden alle bestimmte andere Knoten enthalten (sie haben alle einen IE-Knoten, zum Beispiel), sie KÖNNEN 0 oder mehr andere Knotentypen enthalten (zum Beispiel KÖNNEN sie einen oder mehrere NM-Knoten enthalten oder nicht, oder sie KÖNNEN einen CF-Knoten enthalten oder nicht). Whihc bedeutet (zumindest für mich), dass ich nicht wirklich direkt an XML binden kann, weil:

  1. Es verstößt gegen das MVVM-Muster (ich könnte dies wahrscheinlich für die Demo rechtfertigen, müsste aber später ein Refactoring durchführen).
  2. Ich kann nicht wirklich ein UI-Element an einen XML-Knoten binden, der für ein bestimmtes Element nicht vorhanden sein KANN.
  3. In einigen Fällen muss ich eine Sammlung (z. B. eine Reihe von NM-Elementen) für die Anzeige in eine formatierte Zeichenkette übersetzen, was meines Erachtens nicht trivial ist.

Ich versuche also, den besten Weg zu verstehen, um dieses XML in ein bindungsfähiges Objekt zu übersetzen, was meiner Meinung nach bedeutet, dieses XML in ein Objekt für das Modell zu transformieren und dann ein Ansichtsmodell über dieses Modell zu legen.

Kann dies leicht mit LINQ zu XML-Abfragen getan werden, oder bin ich wirklich in den Bereich eines ORM wie NHibernate oder Entity Framework (keine heiligen Kriege über WELCHE ORM bitte) bewegen?
Ich habe gerade erst festgelegt, welche Steuerelemente ich für die Benutzeroberfläche verwenden werde, und ich muss meinem Vorgesetzten ziemlich schnell demonstrieren WIE Ich werde mich um die Übersetzung kümmern.

Also, die eigentlichen Fragen:

  1. Will ich NEED ein ORM? Ich bin nicht gegen ihre Verwendung, aber ich möchte die Größe der XAP-Datei klein halten und die Menge an neuer Technik, die ich (und meine Kollegen) in einem einzigen Durchgang lernen müssen, begrenzen.
  2. Wenn ich einen brauche, kann ich die Dateigröße gering halten und kann ich mit EF oder NHibernatge schnell hochfahren und sehr bald ein Modell vorzeigen? Ich spreche hier von etwa einer Woche, um ein SOMETHING die die Ausgabe vom Webservice in ein Objekt umwandelt, auch wenn die Karte anfangs nicht perfekt ist, muss ich einige Fortschritte demonstrieren.
  3. Gibt es eine andere Option insgesamt, die ich nicht in Betracht ziehen, die einfacher sein könnte, die Notwendigkeit, bestehenden Code (d.h. den Webservice) zu ändern und Produkt brauchbare Ergebnisse zu begrenzen?

9voto

Amy B Punkte 104656

Brauche ich ein ORM?

Nein. Sie bilden nicht auf eine relationale Quelle ab, daher ist ein objektrelationaler Mapper nicht hilfreich.


Erledigen Sie es mit Linq zu Xml .

public CustomClass TranslateME(XElement source)
{
  CustomClass result = new CustomClass();
  result.Words = (int) source.Attribute("Words");
  result.Score = (int) source.Attribute("Score");

  XAttribute highScore = source.Attribute("HighScore");
  result.HighScore = (highScore == null) ? 0 : (int) highScore;

  result.NMs = source
    .Elements("NM")
    .Select(x => x.Value)
    .ToList();

  result.IE = source
    .Element("IE").Value;

  result.SubEntries = source
    .Elements("M1")
    .Select(x => TranslateM1(x))
    .ToList();

  return result;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X