2009-08-21 6 views
1

Bei Verwendung einer Service Locator-Klasse zum Bereitstellen von ViewModels für Ihre WPF-Seiten, an die gebunden werden soll. Sollten die ViewModels Singletone oder Factory Scoped sein? Ist generell eine bessere Idee für WPF-Anwendungen?Bereich der Ansichtsmodelle bei Verwendung des Service Locator-Musters in WPF-App

Mir ist bekannt, dass Singleton in Silverlight besser für Seiten, die Benutzersteuerelemente sind und nur in den Vordergrund und aus dem Vordergrund verschoben werden. Aber bis zu dem Versuch, dieses Muster anzuwenden, habe ich jedes Mal, wenn sie geladen werden sollen, Instanzen von Seiten und ihren jeweiligen VMs neu erstellt.

Ich und mein Kollege haben alle Plus- und Minuspunkte für jede Option durchgespielt und es gibt nichts, was herausschreien würde, was die bessere Option für unser Szenario ist.

Danke.

Antwort

2

Ich würde bleiben von der Herstellung Ihrer View-Modelle Singletons. Es sei denn, es handelt sich um Ansichten, die in einer Region für die gesamte Benutzersitzung beibehalten werden. Dinge wie Navigation oder Menüs usw. Wenn Sie etwas mit dem Prism/Composite WPF verwenden, nutzen sie Unity als IoC oder Service Locator (wenn Sie es so verwenden), werden View Models/Presentation Models erstellt und für die Garbage Collection freigegeben wenn geschlossen. Dadurch kann jeder Bildschirm seinen Lebenszyklus wie vorgesehen durchlaufen.

Sie können Dinge wie den RegionManager (CompositeWPF) verwenden, um die Ansichtsmodelle im Speicher zu halten, bis sie explizit geschlossen werden. Dadurch können Benutzer geöffnete Ansichten anzeigen, wobei die Interaktionen beibehalten werden, wenn dies erforderlich ist. Wenn der Benutzer beschließt, einen Bildschirm zu speichern/zu schließen, wird er aus dem RegionManager entfernt und wird dann mit Müll gesammelt.

Singletons sind Entwurfsmuster, die für einen bestimmten Zweck verwendet werden, d. H. Sie benötigen nur einen und benötigen nur einen für die Lebensdauer der Anwendung. Wenn das nicht die Voraussetzung ist, bleibe ich weg.

0

Nun, wenn ich zurücktrete, um darüber nachzudenken, was ein View-Modell macht; Ich weise ihm ein Model zu und dann benutze ich Befehle oder Bind-Eigenschaften.

So sofort jedes ViewModel ist eine Instanz für ein Modell.

Auch die ViewModel-Methoden funktionieren im Allgemeinen mit der aktuellen Modellinstanz. Dies bedeutet, dass die Methoden keine isolierten logischen Einheiten sind. d. h.

interface IService 
{ 
    Foo Model; 
    Result DoSomethingWithModel(); 
} 

hat die Logik abhängig von ihrem eigenen Instanzzustand.

während dies ist ein reiner logischer Service:

interface IService 
{ 
    Result DoSomething(With me); 
} 

Eine guter Code Praxis, meiner Meinung nach, wäre eine neue Ansichtsmodell-Instanz auf jeder Anfrage zu injizieren, auch wenn man immer nur einen Wunsch hat.

+0

Sorgfältig zu erklären, die down vote? Wie ich zu der gleichen Schlussfolgerung als eine akzeptierte Antwort komme, hier: http://stackoverflow.com/questions/6188584/viewmodel-and-singleton-pattern –