Dans l'échantillon injection de vue de Microsoft/article qu'ils ont le code comme ce qui suit:Prism Voir Présentateur Injection et 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
ici Presenter est résolu qui contient la propriété publique de type IEmployeesView et c'est utilisé pour injecter la vue à la région. L'avantage de résoudre le présentateur est qu'il est automatiquement lié à la vue (en le prenant dans le constructeur (via l'unité)). Cependant, ne pensez-vous pas que le Presenter est sujet à la garbage collection parce que rien ne fait référence au présentateur après la fin de la portée de la méthode initialize?
View/ViewModel ne fera évidemment référence au présentateur que si VM/View a un événement souscrit par le présentateur. Nous pouvons entrer dans un état incohérent dans lequel la vue est active mais le présentateur est collecté.
Pour éviter la récupération de mémoire du présentateur, nous aurons probablement besoin d'une propriété KeepAlive dans ViewModel qui contient simplement la référence au présentateur pour empêcher son GC, mais cela me semble bizarre. Que faites-vous ou feriez-vous dans cette situation?
Veuillez noter que dans une situation où il y aura plusieurs instances de la vue, l'enregistrement du présentateur avec ContainerControlledLifetimeManager n'est pas réalisable. Aussi, si le mode de communication pour le présentateur (avec vue) est via des commandes et que les commandes sont des Commandes de prisme, alors elles ne garderont qu'une faible référence au présentateur, ce qui ne servira pas non plus le but.
Le * conteneur * ne contient-il pas la référence au Presenter, c'est la raison pour laquelle vous l'utilisez? Le code affiché consiste simplement à saisir une référence à ce présentateur et à coller sa vue dans une région ... –
À quoi faites-vous référence en tant que conteneur? –
Le conteneur est le conteneur UnityContainer. Généralement, un Resolve <> lui-même n'ajoutera l'objet au conteneur que si vous enregistrez le type en tant que ContainerControlledLifetimeManager ou PerInstanceLifetimeManager (que vous pouvez écrire) qui l'ajoutera au conteneur. – aqwert