Ich entschuldige mich für die lange Frage, es liest sich ein bisschen wie ein Scherz, aber ich verspreche, es ist nicht! Ich habe meine Frage (n) unten zusammengefasst
In der MVC-Welt sind die Dinge einfach. Das Modell hat Zustand, wobei die Ansicht zeigt das Modell, und der Controller funktioniert Sachen / mit dem Modell (im Wesentlichen), hat ein Controller keinen Zustand. Um Dinge zu erledigen, hat der Controller einige Abhängigkeiten von Webservices, Repository und dem Los. Wenn Sie einen Controller instanziieren, ist es Ihnen wichtig, diese Abhängigkeiten bereitzustellen, sonst nichts. Wenn Sie eine Aktion (Methode auf dem Controller) ausführen, verwenden Sie diese Abhängigkeiten, um das Modell abzurufen oder zu aktualisieren oder um einen anderen Domänendienst aufzurufen. Wenn es einen Kontext gibt, beispielsweise wenn ein Benutzer die Details eines bestimmten Elements anzeigen möchte, übergeben Sie die ID dieses Elements als Parameter an die Aktion. Nirgendwo im Controller gibt es einen Verweis auf einen Zustand. So weit, ist es gut.
Geben Sie MVVM ein. Ich liebe WPF, ich liebe Datenbindung. Ich liebe Frameworks, die das Binden von Daten an ViewModels noch einfacher machen (mit Caliburn Micro atm). Ich bin der Meinung, dass die Dinge in dieser Welt weniger einfach sind. Machen wir die Übung noch einmal: Das Modell hat einen Status, die Ansicht zeigt das ViewModel und das ViewModel erledigt (im Grunde genommen) Dinge mit dem Modell, ein ViewModel hat einen Status! (zu klären, vielleicht delegiert alle Eigenschaften auf ein oder mehrere Modelle, aber das bedeutet , es muß einen Verweis auf das Modell eine oder andere Weise haben, der Zustand , in sich ist) Zu tunSachen, die das ViewModel hat einige Abhängigkeiten von Webservices, Repository, die Menge. Wenn Sie ein ViewModel instanziieren, müssen Sie diese Abhängigkeiten angeben, aber auch den Status. Und das, meine Damen und Herren, ärgert mich bis zum Äußersten.
Wann immer Sie ein ProductDetailsViewModel
von instanziieren müssen ProductSearchViewModel
(von dem Sie das aufgerufen haben, ProductSearchWebService
das wiederum zurückgekehrt ist IEnumerable<ProductDTO>
, alle noch bei mir?), Können Sie eine der folgenden Aktionen ausführen:
- nennen
new ProductDetailsViewModel(productDTO, _shoppingCartWebService /* dependcy */);
, das ist schlecht, stellen Sie sich 3 weitere Abhängigkeiten vor, dies bedeutetProductSearchViewModel
, dass Sie diese Abhängigkeiten auch übernehmen müssen. Auch das Ändern des Konstruktors ist schmerzhaft. - nennen
_myInjectedProductDetailsViewModelFactory.Create().Initialize(productDTO);
, die Fabrik ist nur eine Func, sie werden leicht von den meisten IoC-Frameworks generiert. Ich denke, das ist schlecht, weil Init-Methoden eine undichte Abstraktion sind. Sie können das Schlüsselwort readonly auch nicht für Felder verwenden, die in der Init-Methode festgelegt sind. Ich bin mir sicher, dass es noch ein paar Gründe gibt. - call
_myInjectedProductDetailsViewModelAbstractFactory.Create(productDTO);
So ... das ist das Muster (abstrakte Fabrik), das normalerweise für diese Art von Problem empfohlen wird. Ich dachte, es war genial, da es mein Verlangen nach statischem Tippen stillt, bis ich es tatsächlich benutzte. Die Menge des Kesselschild-Codes ist meiner Meinung nach zu groß (abgesehen von den lächerlichen Variablennamen, die ich benutze). Für jedes ViewModel, das Laufzeitparameter benötigt, erhalten Sie zwei zusätzliche Dateien (Factory-Schnittstelle und Implementierung), und Sie müssen die Nicht-Laufzeit-Abhängigkeiten wie 4 zusätzliche Male eingeben. Und jedes Mal, wenn sich die Abhängigkeiten ändern, können Sie sie auch im Werk ändern. Es fühlt sich an, als würde ich nicht einmal mehr einen DI-Container verwenden. (Ich denke, Castle Windsor hat eine Lösung dafür [mit seinen eigenen Nachteilen, korrigieren Sie mich, wenn ich falsch liege]). - Machen Sie etwas mit anonymen Typen oder einem Wörterbuch. Ich mag meine statische Eingabe.
Also ja. Das Mischen von Zustand und Verhalten auf diese Weise schafft ein Problem, das in MVC überhaupt nicht existiert. Und ich habe das Gefühl, dass es derzeit keine wirklich angemessene Lösung für dieses Problem gibt. Nun möchte ich einige Dinge beobachten:
- Die Leute benutzen tatsächlich MVVM. Entweder kümmern sie sich nicht um alles, oder sie haben eine brillante andere Lösung.
- Ich habe kein detailliertes Beispiel für MVVM mit WPF gefunden. Zum Beispiel hat mir das NDDD-Beispielprojekt sehr geholfen, einige DDD-Konzepte zu verstehen. Es würde mir sehr gefallen, wenn mich jemand in eine ähnliche Richtung wie MVVM / WPF lenken könnte.
- Vielleicht mache ich MVVM falsch und ich sollte mein Design auf den Kopf stellen. Vielleicht sollte ich dieses Problem überhaupt nicht haben. Nun, ich weiß, dass andere Leute die gleiche Frage gestellt haben, also denke ich, dass ich nicht der einzige bin.
Zusammenfassen
- Bin ich zu Recht der Ansicht, dass das ViewModel als Integrationspunkt für Status und Verhalten der Grund für einige Schwierigkeiten mit dem MVVM-Muster insgesamt ist?
- Ist die Verwendung des abstrakten Factory-Musters die einzige / beste Möglichkeit, ein ViewModel statisch zu instanziieren?
- Gibt es so etwas wie eine ausführliche Referenzimplementierung?
- Ist es ein Designgeruch, viele ViewModels mit beiden Zuständen / Verhaltensweisen zu haben?