2016-10-20 7 views
0

Ich habe zwei Bildschirme, die eine Liste von Elementen verwalten müssen. Der Benutzer kann vom ersten Bildschirm zum zweiten Bildschirm navigieren.So verwalten Sie eine Instanz mit einer bestimmten Lebensdauer

Wenn der Benutzer vom ersten Bildschirm zurück navigiert, muss die Liste der Elemente in einem Geschäft gespeichert werden.

Die Art und Weise, wie ich dachte, es zu tun, einen Service zu haben, der die Ansammlung hält, die in die Ansichtmodelle eingespritzt wird. Aber die Service-Instanz muss einmal Benutzer freigegeben wird navigiert zurück vom 1. Bildschirm:

// somewhere, maybe in Application: 
LifetimeManager = new ContainerControlledLifetimeManager(); 
Container.RegisterType<Service>(lifetimeManager); 

class FirstPage() 
{ 
    ContainerControlledLifetimeManager _lifetimeManager; 

    public FirstPage() 
    { 
     InitializeComponent(); 
    } 

    void OnDisappearing() 
    { 
     LifetimeManager.RemoveValue(); 
    } 
} 

Aber das scheint ungeschickt, es ein besserer Weg zu sein, hat diese ...

ich ein ExternallyControlledLifetimeManager sehen, dass es zu tun was scheint, ist es, was ich brauche, aber es würde immer noch für FirstPage Instanz benötigen, um die Instanz des Managers zu erhalten und RemoveValue aufrufen. Oder ich würde GC.Collect auf OnDisappearing anrufen, um sicherzustellen, dass der GC die Instanz des Dienstes sammelt, und ExternallyControlledLifetimeManager wird es neu erstellen, wenn es das nächste Mal in dem FirstPageViewModel injiziert werden muss. Aber GC.Collect scheint falsch zu sein ...

+0

Die Art, wie Sie versuchen, einen Dienst zu verwenden, macht keinen Sinn. Warum brauchen Sie einen Dienst, der beim Navigieren zu einer Ansicht identisch ist, aber wenn Sie zurück navigieren, muss es anders sein? Ich denke, Sie müssen die Funktion Ihres Dienstes überdenken. –

+0

Danke für das Kommentieren. Der erste Bildschirm erstellt eine Liste von Elementen im Speicher, die der zweite Bildschirm ebenfalls verwenden muss. Sobald der Benutzer vom ersten Bildschirm zurück navigiert, muss die Liste im Repository gespeichert werden. Ich dachte, der Service ist ein guter Weg, um die Liste zwischen den Bildschirm-View-Modellen zu teilen, und ich kenne nicht die richtige Art, wie es mit DI funktionieren sollte. Nicht sicher, aber ich denke, die Liste ist wie eine Sitzung, die das 1. View-Modell erstellt und dann auch von der 2. verwendet werden muss. – JamesL

+0

Ist es besser, statt eines Service eine Kind-View-Model-Instanz zwischen den beiden Screen-View-Modellen zu teilen? Aber ich weiß immer noch nicht, wie ich das mit DI machen soll. – JamesL

Antwort

1

Aufgrund Ihrer Kommentare klingt es so, als ob Sie Ihre Daten über Navigationsparameter an Ihre Ansichten weitergeben sollten. Dann kann jede Seite die Parameter anders behandeln. Halte es einfach.

var p = new NavigationParameters(); 
p.Add("items", MyListOfItems); 
_regionManager.RequestNavigate("MyView", p); 
0

Setzen Sie Ihre Service in einem anderen Dienst, dessen Aufgabe es ist, die aktuelle Instanz von Service bereitzustellen.

interface IServiceProvider 
{ 
    Service CurrentInstance { get; set; } 
} 

registrieren, dann diese ist als Singleton (ContainerControlledLifetimeManager) und in beiden Ansicht Modelle verwenden. Die erste setzt die Instanz auf eine neue Instanz, die höchstwahrscheinlich von einigen IServiceFactory erstellt wurde, und die zweite füllt die Instanz mit Daten.

+0

Danke für Ihre Kommentare. Ich habe meine Frage im Lichte des Kommentars von Brian aktualisiert. Es ist mir in Ihrem Beispiel nicht klar, wie sichergestellt wird, dass der Dienst so lange wie der erste Bildschirm läuft. – JamesL

+0

macht es Ihnen etwas aus, einen kleinen Code zu teilen, vielleicht – JamesL

+0

Der Dienstanbieter ist als Singleton registriert und lebt somit so lange wie die App, so dass er eine Serviceinstanz am Leben erhält, solange sie ihr zugewiesen ist. Abhängig von Ihren Anforderungen können Sie die Instanz beim Ersetzen entweder ablegen oder sie einfach für die Speicherbereinigung lassen. – Haukinger

Verwandte Themen