Wir stehen kurz vor der Erstellung unserer ersten WPF-Anwendung und machen uns mit dem MVVM-Muster vertraut. Wir haben viele Winform-Anwendungen erstellt und verfügen über eine Architektur, die für uns sehr erfolgreich war. Wir haben ein bisschen Probleme, diese Architektur zu übersetzen oder festzustellen, wo bestimmte Teile unserer Architektur in das MVVM-Modell passen.
Historisch gesehen haben wir eine Gui (die Haupt-Exe), die dann mit einer BusinessLogic-DLL kommuniziert. Die BusinessLogic kommuniziert über einen Webdienst mit einer DAL-DLL, und die DAL interagiert mit der DB. DAL, BusinessLogic und GUI verweisen alle auf dieselbe BusinessObjects-DLL.
Ein Teil des Übergangs zu MVVM ist recht unkompliziert. Unsere Benutzeroberfläche enthält weiterhin die Ansichten, unsere BusinessOjbects enthalten weiterhin das Modell und unser DAL interagiert weiterhin mit der Datenbank (obwohl sich die Technologie zu deren Implementierung möglicherweise ändert).
Was uns nicht sicher ist, ist unsere BusinessLogic-Komponente. Historisch gesehen würde dies Funktionen für die GUI bereitstellen, um dann Steuerelemente in den Ansichten aufzufüllen (dh GetCustomerList, die eine Liste von Kundenobjekten oder die typischen CRUD-Funktionen zurückgeben würden).
Das Hauptproblem ist, ob das MVVM-Muster eine zusätzliche Komponente zur Aufnahme der ViewModels erfordern würde oder ob wir nur unser Denken ändern und das, was wir als BusinessLogic-Komponente verwendet haben, auf die ViewModels migrieren?
Stellt unsere BusinessLogic-Komponente die ViewModels dar?
quelle
Antworten:
Im Allgemeinen würde ich keine Geschäftslogik in die Ansichtsmodellebene einfügen. Der Begriff "Geschäftslogik" ist jedoch irreführend.
Eric Evans verwendet ein Modell, bei dem die Geschäftslogik in zwei Kategorien unterteilt ist
Er nennt das Beispiel einer Buchhaltungsanwendung. Regeln über Konten, Posten, Steuerkonten usw. sind Domänenregeln, Regeln, die sich auf die Domäne der Buchhaltung beziehen. Die Logik des CSV-Imports / -Exports hat nichts mit der Domäne des Rechnungswesens zu tun. Diese Regeln existieren nur, weil wir eine Softwareanwendung erstellen. Dies sind Beispiele für Anwendungslogik.
Domänenregeln sollten NIEMALS in die Ansichtsmodellebene aufgenommen werden. Wenn Sie dem MVVM-Muster folgen, werden die Domänenregeln ohne Frage in die Modellschicht übernommen.
Anwendungsregeln, wie z. B. CSV-Import / Export, können in die Ansichtsmodellebene eingefügt werden. Aber ich persönlich würde es vorziehen, das in eine separate Anwendungslogikebene aufzuteilen.
Das Ansichtsmodell sollte sehr einfach sein. Nachschlagen der für die Ansicht im entsprechenden Modell erforderlichen Daten, Aktualisieren des Modells bei Änderungen der Ansicht, Abhören von Ereignissen im Modell und Übertragen dieser Ereignisse in die Ansicht, sodass die Ansicht aktualisiert werden kann, wenn das Modell im Hintergrund aktualisiert wird (wenn anwendbar).
Persönlich würde ich sicherstellen, dass der Ansichtsmodell-Layer nur eine Art von Logik enthält, die Präsentationslogik.
quelle
Ja.
Die Geschäftslogikschicht wird durch die VM-Schicht dargestellt. Migrieren Sie einfach Ihr mentales Modell.
Eine kleine Nuance bei der mentalen Modellmigration ist, dass die GUI (View) -Objekte an Objekte innerhalb der VM-Ebene gebunden werden sollten. Diese Bindung übersetzt in impliziert, dass die Ansicht nicht länger die Ebene ist, die "den Anruf tätigt", um etwas anderes abzurufen. Der Aufruf zum Abrufen von Daten erfolgt stattdessen über die VM.
Zur besseren Erklärung: Ja, ein Objekt in der Ansicht muss geändert werden, um die Abfolge der Dinge auszulösen, die den Aufruf auslösen. Die Ansicht ruft jedoch nicht selbst an. In diesem Fall sehe ich einen Klick auf eine Schaltfläche als äquivalent zu einer Änderung in der Ansicht an, die den Anruf jedoch nicht tätigt.
Im ersten Fall wird dieses View-Objekt an ein VM-Objekt gebunden. Die VM sollte auf ein Ereignis mit geänderten Eigenschaften für das gebundene Objekt warten. Das Objektänderungsereignis kann dann mit einer VM-Funktion verbunden werden, um den Model-Aufruf durchzuführen.
Im zweiten Fall (Tastenklickereignis) kann das Änderungsereignis (Klickereignis) mit einem Funktionsaufruf verknüpft werden, der von der VM verfügbar gemacht wird.
In beiden Fällen handelt es sich immer um ein Ereignis, das in die VM eingeht und dann das Modell aufruft, das wiederum die DAL / DB aufruft.
Ich rufe es auf, weil WinForm-Code verwendet wird, um den DB-Layer direkt vom Code-Behind der WinForm-GUI aufzurufen. Dieser Ansatz unterbricht die Trennung, die MVVM bietet.
quelle
View
Ebene soll eine visuelle Darstellung des ViewModel oder Modells sein. Anstatt zu sagen, dass das Klickereignis mit einem Funktionsaufruf auf der VM verbunden ist, ist es eine bessere Definition, zu sagen, dass der Befehl in der VM als Button in gerendert wird die Ansichtsebene. Außerdem gefällt es mir normalerweise nicht, dass mein Model-Layer direkt auf die DAL zugreifen kann, sodass mein Anwendungsfluss normalerweise dahin gehtVM -> DAL -> DB
, wo dieVM
undDAL
beide die einfachenModel
Datenobjekte verwenden.Sie haben Recht, dass Sie Ihre BusinessLogic-DLL im Wesentlichen durch Ihren ViewModel-Layer ersetzen würden. Der größte Unterschied besteht jedoch darin, wie der View / UI-Layer mit Ihrem ViewModel / BusinessLogic-Layer interagiert.
In WinForms ist die GUI Ihre Anwendung und für den Anwendungsfluss verantwortlich. In WPF / MVVM sind Ihre ViewModels Ihre Anwendung, und die GUI wird zu einer benutzerfreundlichen Oberfläche für die Interaktion mit den ViewModels.
Mit WinForms verfügen Sie beispielsweise möglicherweise über ein DataGrid und eine Schaltfläche. Wenn Sie auf diese Schaltfläche klicken, rufen Sie
BusinessLogicLayer.GetProducts()
die resultierenden Product-Objekte auf und laden sie in das DataGrid.Mit WPF hätten Sie ein ViewModel, das ein
ObservableCollection<Products>
und ein enthält.ICommand GetProducts
Wenn Sie den Befehl ausführen, wird die DAL aufgerufen und die Auflistung der Produkte geladen. Um jedoch eine benutzerfreundliche Oberfläche bereitzustellen, müssen Sie eine Ansicht erstellen, in der Ihr ViewModel mit einem DataGrid für die Products-Auflistung und einer Schaltfläche für den GetProducts-Befehl gerendert wird.Ich habe kürzlich in meinem Blog einen Beitrag über die veränderte Denkweise beim Wechsel von Winforms zu WPF in meinem Blog verfasst , und ich denke, der beste Weg, um den Unterschied zusammenzufassen, sind die folgenden Bilder:
quelle