Ich habe einmal ein MVVM / WPF-Projekt gestartet, das schließlich erstellt und bereitgestellt wurde, und dafür habe ich viel über das Caliburn.Micro MVVM-Framework gelernt. Tatsache ist: Ich habe Caliburn.Micro dafür nicht verwendet und einige MVVM-Konzepte (insbesondere nur die ViewModelBase
und RoutedCommand
-Klassen) selbst implementiert .
Jetzt wurde ich einem etwas größeren Projekt zugewiesen: sozusagen einer "Einzelbenutzer-Rich-Client-Offline-Desktop-Anwendung", und ich entschied mich für Caliburn.Micro. Und hier beginnt mein "Problem".
Ich habe in diesem berühmten Blog-Beitrag gelesen, in dessen Titel steht: "Wenn Sie MVVM verwenden, benötigen Sie ein Framework".
"Der Versuch, so etwas wie MVVM ohne Framework zu machen, ist eine enorme Arbeit. Tonnenweise doppelter Code, das Rad neu erfinden und die Leute dazu bringen, anders zu denken .
Zumindest mit einem Framework vermeiden Sie den doppelten Code und müssen das Rad hoffentlich nicht neu erfinden. So können Sie sich auf die Umschulung von Mitarbeitern konzentrieren. Der Umschulungsteil ist im Allgemeinen unvermeidlich, aber ein Framework bietet Installationscode und -struktur, was den Prozess vereinfacht. "
Ich würde der ersten Lesung zustimmen, aber meine tatsächliche Erfahrung mit Caliburn.Micro (CM) in meiner tatsächlichen Bewerbung ist ratlos und desorientiert. Das heißt, das Framework hat den Prozess überhaupt nicht einfacher gemacht, im Gegenteil. Das Lesen der sich ständig wiederholenden Beispiele von Rob Eisenberg in der eher (zu) informelle Dokumentation und versuchen zu schließen Nutzungsmuster aus den gewundenen zur Verfügung gestellten Proben und ihre ganz indirekte Klassen- und Interface - Beziehungen, wo die Dinge scheinen zu Arbeit zu gestalten , basierend auf Nebenwirkungen, scheint menschlich unmöglich, es sei denn, Sie sind ein erfahrenes Genie (Entschuldigung für die Beschimpfung, aber ich denke, Sie wissen, was ich meine).
Ganz zu schweigen davon, dass jedes der oben genannten trivialen Szenarien IoC-Container beinhaltet, mit denen ich noch nie gearbeitet habe und die ein Problem zu lösen scheinen, das ich möglicherweise noch nicht einmal hatte . Ich habe keine Lust, mehr Projektstunden damit zu verbringen, diese Dinge zu lernen, anstatt über meine Problem- und Anwendungsdomänen nachzudenken. Ich wollte nur eine Banane, aber CM gab mir einen Gorilla (IoC) mit einem Korb Bananen.
Jetzt, da ich überlege, zu meinem selbst erstellten MVVM-Framework zurückzukehren, das nur aus wenigen MVVM-spezifischen Klassen besteht, die ich tatsächlich implementieren möchte, möchte ich CM zumindest eine Chance geben, falls ich hier etwas verliere, oder nur einfach die Dinge "auf die falsche Art und Weise" aus purer Unerfahrenheit und Unwissenheit heraus zu tun. Die Frage ist also:
Es herrscht allgemeiner Konsens darüber, dass "Frameworks die Dinge einfacher und natürlicher machen". Wenn ich jedoch das Gegenteil erlebe, bedeutet dies, dass ich das Framework nicht verwenden sollte oder dass ich versuche, es falsch zu lernen? Gibt es einen Hinweis darauf, dass ich überhaupt kein Framework verwenden sollte? Oder gibt es einen "richtigen" Weg, um herauszufinden, wie CM für die einfache MVVM-Entwicklung verwendet wird?
quelle
EventAggregator
für Messaging undNotificationObject
ViewModelBase sowie MVVM LightRelayCommand
für Befehle. Das Wichtigste ist, zu identifizieren, welche Probleme das Framework für Sie lösen wird, und nur diese Lösungen zu verwenden. Sie müssen nicht die gesamte Framework-Bibliothek verwenden.RelayCommand
Implementierung finden (da er direkt an Methoden gemäß Konvention "bindet", anstatt an ICommand-Eigenschaften zu binden).RelayCommand
aus einer anderen Bibliothek nicht verwenden könnten, wenn die von Caliburn Micro verwendete nicht für Sie funktioniert.Antworten:
Ich habe CaliburnMicro und MVVMLight ausprobiert und bei der Verwendung von Caliburn habe ich wirklich das Gefühl, dass Sie sich wirklich magisch fühlen, wenn Sie die Kontrolle an eine Eigenschaft binden, indem Sie einfach Name = "PropertyName" anstelle von altem Text = "{Bind PropertyName}" verwenden, aber in Ende Caliburn geht weit über Bord, um diese magische Sache zu tun. Wenn etwas schief geht, ist es wirklich schwierig, Fehler zu beheben, und noch schlimmer, sie haben eine Menge Möglichkeiten, eine Sache zu tun.
Aber wenn Sie MVVMLight verwenden, ist es dünn, und wenn Sie es verwenden, stellen Sie wahrscheinlich fest, dass es fast 100% Ihrem MVVM-Framework entspricht, mit einigen darin enthaltenen Funktionen.
Ich weiß, dass dies Ihre Frage "Wie verwende ich Framework NICHT?" Nicht beantwortet, aber ehrlich gesagt kann ich Ihnen nicht empfehlen, diesen Weg zu gehen, weil es einfach falsch ist einer zuerst.
quelle
Es ist wichtig zu wissen, was MVVM ist. Es handelt sich nicht um eine gemeinsame Funktionalität, die Sie nicht erneut implementieren müssen (Parsen einer JPEG-Datei oder Herstellen einer Verbindung zu einem bestimmten SQL-Datenbankserver), sondern um ein Muster - ein Muster für die Implementierung einer umfangreichen grafischen Benutzeroberfläche. Wenn Ihre Implementierung des Musters einfach und unkompliziert ist, müssen Sie sich meines Erachtens nicht schämen, es statt eines Frameworks zu verwenden.
Tatsächlich glaube ich, dass die ganze Idee von Mustern als Rahmen viel zu weit gegangen ist. Damit etwas ein Muster ist, muss es die allgemeine Form einer Klasse von Lösungen sein. Da dies so ist, ist zu erwarten, dass Muster auf die Systeme zugeschnitten werden müssen, die sie verwenden, und Sie können dies nicht tun, wenn Sie versuchen, ein Muster mit einer Einheitsgröße zu verwenden. Es wäre weitaus konstruktiver, die Musterimplementierung dem Anwendungsdesigner zu überlassen und Bibliotheken bereitzustellen, die die Funktionalität und nicht die Architektur einschließen.
quelle
DataContext
usw.Meine erste Erfahrung mit WPF war die Verwendung von Caliburn.Micro, daher unterscheidet sich dies wahrscheinlich erheblich von den meisten Entwicklern. Ich habe festgestellt, dass sowohl WPF als auch Caliburn.Micro eine ziemlich steile Lernkurve sind, da sie von WinForms stammen. Nach einigen Erfahrungen mit beiden habe ich festgestellt, dass es mir ein Vergnügen ist, sie als Paar zu verwenden. Derzeit arbeite ich in einer anderen Organisation, in der Caliburn.Micro nicht verwendet wird. Ich stelle jedoch fest, dass es VIELEN doppelten Code gibt, der die Codebasis ziemlich aufgebläht und unnötig komplex macht.
Ich stimme definitiv zu, dass es einige Probleme mit Caliburn.Micro gibt, die das Debuggen erschweren können, aber sobald sie einmal erlebt wurden, sind sie mit viel geringerer Wahrscheinlichkeit wieder schmerzhaft. Die erhöhte Entwicklungsgeschwindigkeit, der sauberere und schlankere Code und das allgemeine Framework, das eine bessere MVVM fördert, sind es für mich mehr als wert.
Caliburn.Micro macht auch Standard-WPF nicht ungültig - es baut nur darauf auf, was bedeutet, dass Sie weiterhin WPF-Funktionen verwenden können, wenn Sie möchten, und Caliburn für ein paar Teile verwenden können, wenn Sie möchten. Dies ist in etwa so, wie TypeScript und JavaScript in meinem Kopf zusammen existieren.
Ich würde Caliburn.Micro definitiv in jedem neuen WPF-Projekt verwenden, an dem ich in Zukunft arbeite, wenn ich die Gelegenheit dazu bekomme.
quelle
Wer hier aus Frustration mit Caliburn.Micro ankommt, sollte sich dieses Framework ansehen : Stylet
Es ist von Caliburn.Micro inspiriert, mit der Ausnahme, dass es einen Großteil der Magie beseitigt, die Sie über das, was passiert, desorientiert macht. Darüber hinaus ist die Dokumentation in einer viel einfacheren Sprache verfasst, ohne dass Sie den technischen Jargon durchgehen möchten. Viel besser für Anfänger.
Stylet verfolgt außerdem einen ViewModel-First-Ansatz. Caliburn.Micro und viele andere Frameworks verfolgen einen View-First-Ansatz, der mit einigen umständlichen Problemen einhergeht. Wenn Sie bereits sehr gut mit SOLID-Prinzipien und gemustertem Code vertraut sind, werden Sie einen ViewModel-First-Ansatz wahrscheinlich natürlicher finden, da er die Perspektive einnimmt, dass Ihre Logik das System steuern sollte - nicht die Sicht.
quelle