Ich habe eine Silverlight Windows Phone 7-App, die Daten von einer öffentlichen API abruft. Ich mache immer wieder dasselbe:
Der Inhalt, der dem Benutzer angezeigt wird, kann direkt aus einer Datenquelle, z. B. ObservableCollection
, entnommen werden, oder er kann eine Abfrage in einer Datenquelle sein.
Ich möchte diesen sich wiederholenden Prozess in einen Rahmen ausschließen, in dem idealerweise nur das Folgende spezifiziert werden muss:
Es hört sich vielleicht nach viel an, aber zwei Strings, drei FrameworkElement
s und zwei Methoden sind weniger als der Overhead, den ich derzeit habe.
Dies muss auch funktionieren, aber die Daten werden im Speicher beibehalten und müssen für direkte Sammlungen und Abfragen für diese Sammlungen verwendet werden.
Meine Fragen sind:
Wurde so etwas bereits implementiert?
Sind meine Gedanken zum obigen Thema in irgendeiner Weise grundsätzlich falsch?
Hier ist ein Design, an das ich denke:
Es gibt zwei Komponenten, eine Ansicht und ein Modell.
Der View wird die FrameworkElement
s zum Laden, Fehler und Erfolg gegeben. Es wird auch ein Verweis auf das entsprechende Modell gegeben. Die Ansicht ist ein UserControl
, das irgendwo auf der Benutzeroberfläche platziert wird.
Das Modell Eine Klasse, der der URI für die Daten, eine Methode zum Analysieren der Daten und optional ein Dateiname und das Analysieren der Datei übergeben werden. Es ist verantwortlich für das Abrufen der Daten und das Benachrichtigen der Ansicht, wenn sich der aktuelle Status (Laden / Fehlgeschlagen / Erfolg) ändert. Wenn sich die vom Netzwerk heruntergeladenen Daten vom Cache unterscheiden, haben die Netzwerkdaten Vorrang. Wenn die App geschlossen oder veraltet wird, schreibt das Modell die Daten in den Cache.
Wie klingt das?
Ich habe mir etwas Zeit genommen, um Ihre Anforderungen genau zu lesen und notierte mir einige Gedanken als Resonanzboden.
Erstens ist dies für wiederkehrende Aufgaben mit gemeinsamem Verhalten der richtige Weg. Sie sind nicht allein, wenn Sie über dieses Problem nachdenken.
Leute, die eine Menge von dieser Art von Dingen machen, mögen ähnliche Abstraktionen erzeugt haben, aber meines Wissens wurden keine öffentlich veröffentlicht.
Wie weit Sie damit gehen, hängt davon ab, ob Sie es nur für sich selbst und für diejenigen mit sehr ähnlichen Anforderungen verwenden oder ob Sie allgemeinere Fälle behandeln und ein Produkt herstellen möchten, das von einem sehr breiten Publikum verwendet werden kann .
Ich gehe von ersterem aus, aber das schließt nicht die Möglichkeit aus, es als ein Open-Source-Projekt zu veröffentlichen, das weiter entwickelt und / oder gespalten werden kann.
Indem Sie nicht versuchen, alle Möglichkeiten zu berücksichtigen, können Sie bestimmte Annahmen über die Art der Verwendung der Implementierung und insbesondere über die Auswahl des UI-Designs treffen.
Ich denke, insgesamt denken Sie in die richtige Richtung. Während ich einige Ihrer Gedanken auf hoher Ebene gelesen habe, dachte ich, dass einige Dinge vereinfacht werden können (eine gute Sache) und gleichzeitig eine überzeugende Benutzeroberfläche liefern.
Auf Ihre anfänglichen Punkte.
Auf Ihre möglichen Eingaben.
Zur Implementierung.
Hoffentlich gibt dir das ein paar Dinge, über die du nachdenken kannst, und eine gewisse Beruhigung, dass du auf dem richtigen Weg bist. Es gibt viele Möglichkeiten, wie du das machen kannst. Welches ist der beste Weg letztlich wird durch Ihre Ziele getrieben werden.
Ich entwickle eine WP7-Anwendung, die im Grunde ein Client einer bestehenden REST-API ist. Der Server gibt Daten in JSON zurück. Mit Hilfe der Bibliothek JSON.NET (http://json.codeplex.com/) konnte ich es direkt in meine .NET C # Klassen deserialisieren.
Ich speichere lokal die Daten, um das Offline-Szenario meiner Anwendung zu handhaben und um den Aufruf auf dem Server jedes Mal zu verhindern, wenn der Benutzer die Anwendung startet. Ich biete zwei Möglichkeiten, um die Daten zu aktualisieren: manuell und / oder nach einer gewissen Zeit. Zum Speichern der Daten verwende ich Sertling (http://sterling.codeplex.com/), es ist eine einfache, aber einfach zu verwendende lokale Datenbank für Silverlight / WP7.
Die größte Herausforderung besteht in der asynchronen Kommunikation mit dem Server. Ich biete klare UI-Rückmeldungen (Progressbar und / oder Loading Wheel) an, um dem Benutzer mitzuteilen, was vor sich geht.
Nebenbei verwende ich MVVM Light Toolkit und SL Unit Testing, um den Integrationstest durchzuführen. View Model = & gt; Mein lokaler Client-Code = & gt; Server. (http://code.google.com/p/nunit-silverlight/wiki/NunitTestsWp7)
Tags und Links silverlight architecture windows-phone-7