In Microsofts Ansicht Injektion Probe/article sie haben den Code wie folgt aus:Prism Ansicht Injection Presenter und Garbage Collection
public void Initialize()
{
this.RegisterViewsAndServices();
EmployeesPresenter presenter = this.container.Resolve<EmployeesPresenter>();
IRegion mainRegion = this.regionManager.Regions[RegionNames.MainRegion];
mainRegion.Add(presenter.View);
}
http://msdn.microsoft.com/en-us/library/dd458920.aspx
hier Presenter wird aufgelöst, welche die öffentliche Eigenschaft des Typs IEmployeesView enthält und das wird verwendet, um die Ansicht in die Region zu injizieren. Der Vorteil des Auflösens des Präsentators besteht darin, dass er automatisch an die Ansicht gebunden wird (indem er im Konstruktor genommen wird (über die Einheit)). Aber denkst du nicht, dass der Presenter anfällig für die Garbage Collection ist, weil sich nach dem Ende der Initialisierungsmethode nichts auf den Presenter bezieht?
View/ViewModel hat offensichtlich keinen Bezug zum Moderator, es sei denn, VM/View hat ein Ereignis, das vom Moderator abonniert wurde. Wir können in einen inkonsistenten Zustand wechseln, in dem die Ansicht aktiv ist, der Moderator jedoch als Müll gesammelt wird.
Um Speicherbereinigung von Presenter zu verhindern, benötigen wir wahrscheinlich eine KeepAlive-Eigenschaft in ViewModel, die nur den Verweis auf Presenter hält, um seinen GC zu verhindern, aber das klingt Hacky für mich. Was machst oder machst du in dieser Situation?
Bitte beachten Sie, dass in einer Situation, in der es mehrere Instanzen der Ansicht gibt, die Registrierung des Präsentators mit ContainerControlledLifetimeManager nicht möglich ist. Auch wenn der Kommunikationsmodus für den Moderator (mit der Ansicht) über Befehle erfolgt und die Befehle zufällig Delegiertenkommandos des Prismas sind, werden sie nur einen schwachen Bezug auf den Präsentator behalten, so dass dies auch nicht dem Zweck dient.
Enthält * der Container * nicht den Verweis auf den Presenter, weshalb verwenden Sie ihn? Der Code zeigt nur einen Verweis auf diesen Presenter, und seine Ansicht in eine Region ... –
Was meinen Sie als Container? –
Container ist der UnityContainer. In der Regel fügt ein Resolve <> selbst das Objekt nicht zum Container hinzu, es sei denn, Sie registrieren den Typ als ContainerControlledLifetimeManager oder PerInstanceLifetimeManager (den Sie schreiben können), der es dem Container hinzufügt. – aqwert