WPF MVVM WCF client/server-Architektur
Ich bauen möchte, eine grundlegende wpf/mvvm-Anwendung, die ruft die Daten von einem server mit WCF und ermöglicht es dem client anzeigen/Bearbeiten (mit CRUD-Operationen) dieser Daten.
So weit, dachte ich darüber nach, etwas ähnliches für die Architektur :
- ein "globales" Modell-Ebene, die Implementierung, die Validierung, Forschung Kriterien, und die INotifyPropertyChanged-und Dienstleistungsverträge, die
- einige Dienste, Schichten, hauptsächlich durch eine für entity framework 4, die Umsetzung der Verträge von der Modell-Ebene und erlaubt mir, Zugriff und Manipulation von Daten.
- Beachten Sie, dass ich eine offline-Datenquelle als na ja, sagen wir XML oder etwas anderes, und so einem anderen Dienst (ich Plane mit einigen DI/IoC)
- die WCF-Schicht
- Extra-Schicht für Daten speichern der client-Seite ?
- das ViewModel
Ich bin klar auf die Ansichten/ViewModel-Teil, aber ich habe Schwierigkeiten, herauszufinden, die Beziehungen zwischen den Modell -, WCF-und das viewmodel.
Meine Fragen sind :
- Wie soll ich mit dem Modell generiert durch EF ? Es loszuwerden und gehen
für einen code-first-Ansatz manuell tun die Kartierung mit den
Datenbank ? - Für die WCF-Daten-transport, sollte ich auf relationalen
Eigenschaften, die in meinem Modell habe ich.e ein Produkt hat ein Kunde anstelle von einem
CustomerId ? - Sollte ich eine zusätzliche Schicht zwischen der WCF und
das ViewModel für die Speicherung und Manipulation von Daten oder ist es die beste
Praxis direkt stecken Sie das ViewModel ins WCF ?
Andere Tipps für diese Art von Architektur sind willkommen...
- Möchten Sie vielleicht Lesen Sie meine Antwort an stackoverflow.com/q/10437241/50079
- Ihre Antwort ist wirklich sehr gut, danke. Aber ich bin noch nicht vollkommen klar auf dem Modell Teil, vgl. meine Antwort auf ken2k
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es verschiedene Lösungen für die Architektur einer 3-tier-WPF-Anwendung, aber hier ist eine Möglichkeit:
1+2) Eine Lösung ist die Schaffung von "intermediate" - Objekte, die darstellen, was Ihre client-Anwendung tatsächlich benötigt werden.
Zum Beispiel, wenn Ihre Anwendung zum anzeigen von Informationen über ein Produkt sowie der dazugehörigen Kunden-Namen, die man bauen konnte das folgende Objekt:
Können Sie dann über eine stateless-WCF-service, gibt Ihr Produkt aus einer ID:
In die server-Seite der Anwendung (d.h. die Implementierung des service), können Sie die Rückgabe einem
MyProduct
- Instanz erstellen, indem Sie eine Abfrage der Datenbank durch EF (ein Kontext pro Anruf):3) Hinzufügen einer zusätzlichen Schicht zwischen der WCF-Dienste und das ViewModel könnte betrachtet werden als over-engineering. IMHO ist es OK, um WCF-Dienste aufrufen, die direkt aus dem ViewModel. WCF generierten client-proxy-code, der die eigentliche Rolle des Modells (zumindest einen Teil Ihres Modells).
EDIT:
Können Sie die tatsächlichen Personen. Aber auf client-Seite, es ist eine 3-tier-Architektur, haben Sie keinen Zugriff auf die DB über die Navigations-Eigenschaften. Wenn es eine verschachtelte
Customer
- Eigenschaft (vom TypCustomer
), der Kunde hätte Zugang zutheProduct.Customer.Products
ist, hat kein Sinn hat Sie kann nicht lazy load entities auf diese Weise (keine DB-Kontext auf der client-Seite).Abgeflacht "intermediate" POCOs sind viel einfacher IMO. Es gibt keine performance-Probleme, die Zuordnung ist unkompliziert und die CPU-Nutzung für diese bestimmte operation, ist verschwindend gering im Vergleich zu den DB-request-Zeit.
Zunächst einige Allgemeine Informationen: es ist ein wirklich gutes tutorial auf MVVM von Jason Dollinger verfügbar unter Lab49
Bearbeiten
Das video deckt die meisten Bedürfnisse, wenn die Architektur einer WPF-Anwendung.
Dependency injection und die Verbindung zum WCF sind auch abgedeckt (aber
nicht in die Tiefe, wenn man über WCF, aber mit einer wirklich starken Weg
zu kommen mit guten Lösungen hier)
Den source-code, den er entwickelt, ist auch hier erhältlich
Meiner Meinung nach, jeder, der zu tun hat mit MVVM sollte es sehen!
AutoMapper hier helfen kann. Codeplex von AutoMapper
Ihr Problem scheint, wie eine perfekte Passform für das!
Nicht mit Zohan an das Modell! Productid ist Teil der Aufträge und Bestellungen haben eine Kunden-id.
Stick auf diese. In Ihrem service-Schicht, werden Sie wahrscheinlich am Ende mit ids sowieso.
Da Sie wahrscheinlich nicht zu ändern, Produkte noch Kunden hier. Wenn Sie das tun (und meine
Aufträge Beispiel dann nicht passen), können Sie transportieren die dynamische, nicht das statische.
In den meisten Fällen habe ich eine service-Schicht mit bekommt Injektion in meinem viewmodel in den Konstruktor.
Kann davon ausgegangen werden, einer anderen Ebene, als es mit der WCF-client-Teil und
Griffe der "geändert" - Veranstaltungen von der server-Seite. (geänderte Zeile, neue Zeile, Zeile gelöscht etc)
Bearbeiten
Wenn Sie Versand Ihr service-layer Ereignisse, ist es viel einfacher zu haben
das kleine, leichte Schicht zwischen WCF und ViewModel. Sobald Sie haben
zu, Sie werden wahrscheinlich kommen mit einer solchen Ebene natürlich.